hibernate级联添加多对多怎么添加

hibernate里表一对多,多对多关系的实现
hibernate里表一对多,多对多关系的实现
17:43:00来源:
数据库一对多,多对多通过java文件实现的方法一对多关系有Father和Children的关系,一个父亲可以有多个孩子,在实现的时候,Parent类中要有一个set&Children&字段,而Children类中要有一个Father字段。在生成表的时候会在"多"哪一方增加一个"一"那一方的id,也就是说会在Children表中增加一个父亲表的idFather.javaprivateString privateString parent_ private Set&Children&//父亲类中放一个集合("一"中放多个对象) //一个父亲有多个孩子,mappedBy后面跟的是Children类的fat字段
@OneToMany(mappedBy = "fat") public void setChil(Set&Children& chil){ this.chil= } public Set&Children& getChil(){ return } //其他set和get方法 Children.javaprivateString privateString children_ private F//孩子类中放一个父亲("多"中放一个对象)//多个孩子可以属于一个父亲,name后面跟的内容为在建表的时候在children表中增加的一个字段
@ManyToOne @JoinColumn(name = "father_id", nullable = false) public void setFat(Father fat){ this.fat= } public Father getFat(){ return } //其他set和get方法 多对多关系教师和学生的关系,一个教师可以教多个学生,一个学生可以被多个教师教。出现这种情况的时候将会需要三张表,多出一张中间表,中间表用来存放教师和学生的idTeacher.javaprivateString privateString tather_ private Set&Student& //生成一个叫"student_teacher"的中间表,表里面有 "teacher_id"和"student_id"两个字段。 ?@ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}, fetch = FetchType.LAZY) @JoinTable( name = "student_teacher", joinColumns = {@JoinColumn(name = "teacher_id")}, inverseJoinColumns = {@JoinColumn(name = "student_id")} ) ??? @org.hibernate.annotations.OrderBy(clause = "teacher asc") public void setStu(Set&Student& stu){ this.stu= } public Set&Student& getStu(){ return } //其他set和get方法 Student.javaprivateString privateString teacher_ private Set&teacher& tea? //mappedBy 后面跟的是Teacher类里面的stu字段 @ManyToMany(mappedBy = "stu") public void setTea(Set&Teacher& tea){ this.tea= } public Set&Teacher& getTea(){ return } //其他set和get方法<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
您的访问请求被拒绝 403 Forbidden - ITeye技术社区
您的访问请求被拒绝
亲爱的会员,您的IP地址所在网段被ITeye拒绝服务,这可能是以下两种情况导致:
一、您所在的网段内有网络爬虫大量抓取ITeye网页,为保证其他人流畅的访问ITeye,该网段被ITeye拒绝
二、您通过某个代理服务器访问ITeye网站,该代理服务器被网络爬虫利用,大量抓取ITeye网页
请您点击按钮解除封锁&hibernate多对多,多对一的值的插入
在网上看了很多对hibernate操作时,如果出现了多对多关系或者出现了多对一关系的时候在插入值的时候会出现问题。我在这做个例子希望对有些朋友可以起到帮助的作用。
public class User implements java.io.Serializable {
private Integer userId;
private String userN
private Set roles = new HashSet(0);
//省略get/set方法和构造方法
public class Role implements java.io.Serializable {
&&& private
&&& private
&//省略get/set方法和构造方法
在service方法里面进行处理
一。如果在添加user的同时也往user里面添加role的时候呢
先执行user的添加语句:userDao.add(user);
for(Roles role:rlist){
user.getRoles().add(role);
然后在执行userDao.merge(user);
二。如果已经存在user只是往里面添加role对象的话则
for(Roles role:rlist){
user.getRoles().add(role);
userDao.merge(user);就可以了
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。5939人阅读
Hibernate(23)
以Student和Course为例,一个学生可以选多门课程,一门课程也可以被多个学生选取;
持久化类Student:
import java.util.S
public class Student {
private S//学生姓名
private Set&Course&//该学生选择的课程
//省略set、get方法
}持久化类Course:
import java.util.S
public class Course {
private S//课程名称
private Set&Student&//选择该课程的学生
//省略set、get方法
}对象关系映射文件Student.hbm.xml:
&hibernate-mapping&
&class name=&bean.Student& table=&students&&
&id name=&id& column=&id& type=&long&&
&generator class=&increment&&&/generator&
&property name=&name& column=&name& type=&string&&&/property&
&set name=&courses& table=&students_courses& cascade=&save-update&&
&key column=&student_id&&&/key&
&many-to-many class=&bean.Course& column=&course_id&&&/many-to-many&
&/hibernate-mapping&
多对多关联关系的实现需要一个连接表,&set&的属性指出的就是连接表的名称,&key&指出连接表参照students表id的外键的字段名;&many-to-many&中的class指定与Student多对多关联的类,column指定连接表参照Course映射表(此处由Course.hbm.xml映射为courses表)id的外键的字段名,Course.hbm.xml中的&set&配置与Student.hbm.xml中&set&相反:
Course.hbm.xml:
&hibernate-mapping&
&class name=&bean.Course& table=&courses&&
&id name=&id& column=&id& type=&long&&
&generator class=&increment&&&/generator&
&property name=&name& column=&name& type=&string&&&/property&
&set name=&students& table=&students_courses& cascade=&save-update& inverse=&true&&
&key column=&course_id&&&/key&
&many-to-many class=&bean.Student& column=&student_id&&&/many-to-many&
&/hibernate-mapping&
注意:两个映射文件中设置的连接表的名称以及连接表中的两个字段名需对应相同,如连接表名都为&students_courses&两字段为&student_id&和&course_id&,否则会导致不必要的麻烦;连接表的主键为联合主键(student_id,course_id)。
三个表的结构及对应关系如下所示:
保存对象:
Student s1=new Student();
s1.setName(&lisi&);
Course c1=new Course();
c1.setName(&English&);
Course c2=new Course();
c2.setName(&science&);
s1.setCourses(new HashSet&Course&());
c1.setStudents(new HashSet&Student&());
c2.setStudents(new HashSet&Student&());
s1.getCourses().add(c1);
s1.getCourses().add(c2);
c1.getStudents().add(s1);
c2.getStudents().add(s1);
session.save(c1);
session.save(s1);
(1)如果两个映射文件的inverse都设为false(默认),则会出现异常(主键重复)导致插入失败:
: Could not execute JDBC batch update
Caused by: : Duplicate entry '1-1' for key 'PRIMARY'
:Duplicate entry '1-1' for key 'PRIMARY'
解释:应为两映射文件中的inverse都为true,则Student和Course都去维护关联关系,即同时向连接表中插入记录,则会导致主键重复而插入失败。
解决办法:
&&&& ——将其中一方的inverse设为true,让对方维持关联关系;
&&&& ——将s1.getCourses().add(c1);或 c1.getStudents().add(s1);删除,因为若某个Course中的students集合为空时,它就不会去向连接表中添加记录,也就不会与Student向连接表中插入记录时冲突而主键重复。
(2)如果都设为true,则都不会向连接表中插入记录而只是向两表中插入记录(两者都认为对方会维持关联关系)执行的SQl语句为:
Hibernate: insert into courses (name, id) values (?, ?)
Hibernate: insert into students (name, id) values (?, ?)
Hibernate: insert into courses (name, id) values (?, ?)(3)设一方的inverse为true,正常插入数据时输出的SQL语句为:
Hibernate: insert into courses (name, id) values (?, ?)
Hibernate: insert into students (name, id) values (?, ?)
Hibernate: insert into courses (name, id) values (?, ?)
Hibernate: insert into students_courses (student_id, course_id) values (?, ?)
Hibernate: insert into students_courses (student_id, course_id) values (?, ?)删除学生(Student)记录:
Student s=(Student)session.get(Student.class, 2L);
session.delete(s);注意:
&&& (1)如果不是Student维持关联关系:
&&&&&&&&&& ——若连接表students_courses中有参照students表中该记录的记录(即在students_courses表中存在student_id为2L的记录)时,则删除失败。
&&&&&&&&&& ——若连接表students_courses中没有参照students表中该记录的记录时,则可以成功地将该记录删除。
&&&& (2)如果是Student维持关联关系:
&&&&&&&&&& ——先将连接表students_courses中参照students表中该记录的记录删除,然后将该学生记录从students表中删除
查询某学生选的所有课程:
Student s=(Student)session.get(Student.class, 2L);
Set&Course& set=s.getCourses();
for (Iterator iterator = set.iterator(); iterator.hasNext();) {
Course course = (Course) iterator.next();
System.out.println(course.getName());
某学生又选了一门新课(增加了连接表中的一条记录):
Student s=(Student)session.get(Student.class, 2L);
Course c=(Course)session.get(Course.class,1L );
s.getCourses().add(c);
c.getStudents().add(s);
删除某学生的一条选课记录(删除了连接表中的一条记录):
Student s=(Student)session.get(Student.class, 2L);
Course c=(Course)session.get(Course.class,1L );
s.getCourses().remove(c);(此时只会删除连接表中的一条记录而不会去修改Students和courses表中的记录)
转载请注明出处:http://blog.csdn.net/jialinqiang/article/details/8698052
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:155287次
积分:1901
积分:1901
排名:第15114名
原创:46篇
评论:27条您现在的位置:&&>>&&>>&&>>&&>>&正文
Hibernate的多对一和一对多操作实例
  Hibernate &&的一对多和多对一操作真的很方便,如果系统采用Hibernate作为持久层,完全可以把对应的一对多和多对一逻辑关系放在Hibernate里面控制,减少数据库的负担,而且也更清晰。
  1、多对一和一对多概念
  其实这个概念上来说很简单,比如一个客户可以有多个订单,多个订单属于同一个客户。就是最基本的一对多,和多对一。数据库使用中,感觉多对一和一对多算是比较常见的逻辑关系了。
  我曾经做过一些数据库,比如某些政府部门的,其表单很设计的很简单粗糙,甚至连主键都没有,完全靠在事务层补全这些关系。其实通过Hibernate持久层来实现逻辑关系也是很不错的方法。下面的例子,就是数据库逻辑上基本没有定义,主要放在持久层里面。这个也主要是我对数据库操作属于半通水的原因。
  2、数据库层
  这里面有两个表单,一个CUSTOMER,客户表单,一个是ORDERS,订单表单。生成客户表单,这个是在SQLServer里面做的,其实其他都一样,因为逻辑关系在Hibernate上面,id是主键非空,其他可以为空:
  1.CREATETABLE[dbo].[CUSTOMER](
  2.[id][numeric](18,0)NOTNULL,
  3.[name][varchar](50)NULL,
  4.[age][int]NULL,
  5.CONSTRAINT[PK_CUSTOMER]PRIMARYKEY)
  订单表单
  id为主键非空,CUSTOMER_id是对应客户主键,也非空,这里不做外键设置。
  6.CREATETABLE[dbo].[ORDERS](
  7.[id][numeric](18,0)NULLPRIMARYKEY,
  8.[CUSTOMER_id][numeric](18,0)NOTNULL,
  9.[ORDER_NUMBER][varchar](50)NULL,
  10.[PRICE][numeric](18,3)NULL
  3、Hibernate设定
  HIbernate里面,一对多的对象体现,是客户有一个集合set,set里面放着对应订单,而多对一体现,是订单里面有一个CUSTOMER对象,表明该订单所属的客户。其中,CUSTOMER类为:
  12.publicclassCustomerimplementsjava.io.Serializable{
  13.privateL
  14.privateS
  15.privateI
  16.privateSetrderses=newHashSet();
  后面的getXXX和setXXX方法就省去了,同样订单类就是:
  19.publicclassOrdersimplementsjava.io.Serializable{
  20.privateL
  21.privateC
  22.privateStringorderN
  23.privateD
  而对应hbm文档,就是map文档如下:
  26.CUSTOMER.hbm.xml
  27.&!DOCTYPEhibernate-mappingPUBLIC"-//Hibernate/HibernateMappingDTD3.0//EN"
  28.""&
  29.&!--
  30.MappingfileautogeneratedbyMyEclipsePersistenceTools
  31.--&
  32.&hibernate-mapping&
  33.&classnameclassname="onetomany.Customer"table="CUSTOMER"schema="dbo"catalog="DBTEST"&
  34.&idnameidname="id"type="java.lang.Long"&
  35.&columnnamecolumnname="id"precision="18"scale="0"/&
  36.&generatorclassgeneratorclass="increment"/&
  37.&/id&
  38.&propertynamepropertyname="name"type="java.lang.String"&
  39.&columnnamecolumnname="name"length="50"/&
  40.&/property&
  41.&propertynamepropertyname="age"type="java.lang.Integer"&
  42.&columnnamecolumnname="age"/&
  43.&/property&
  44.&setnamesetname="orderses"inverse="true"lazy="true"cascade="all"&
  45.&key&
  46.&columnnamecolumnname="CUSTOMER_id"precision="18"scale="0"not-null="true"/&
  47.&/key&
  48.&one-to-manyclassone-to-manyclass="onetomany.Orders"/&
  49.&/set&
  50.&/class&
  51.&/hibernate-mapping&
【责编:coco】
?&[]?&[]?&[]?&[]?&[]?&[]?&[]?&[]?&[]?&[]
相关产品和培训
 友情推荐链接
 认证培训
 专题推荐
 ? ? ? ? ? ? ? ? ? ?
 今日更新
?&?&?&?&?&?&?&?&?&?&
 社区讨论
 博客论点
 频道精选
 Java 频道导航

我要回帖

更多关于 hibernate添加方法 的文章

 

随机推荐