内容摘自Java

永利澳门游戏网址304,Hibernate(或别的ORM)里的inverse用法详解,内容摘自Java web轻量级开辟面试科目,orminverse

    本文来是从 java web轻量级开采面试科目从摘录的。

   
Inverse的立陶宛(Lithuania)语含义是反转,在Hibernate中用来支配是由哪方来维护四个业务实体类之间的涉嫌关系,具体来说,正是由哪方去设置这么些被外键约束的字段值。

   
它的暗许值是false,也正是说,本端(比如inverse=false写在学生端,那么本端是学生,别的一方是课程)不“反转调整权”,那句别扭的话的别的一种说法是,本端维护关系关系。借使两侧都不写,那么两端都维护。这样会导致难题,即新时因为两个都调控关系,因而只怕会招致重复更新。

   
注意,inverse仅仅是钦赐由哪个人来设置外键值,实际不是用来设置级联操作,级联操作的法子由cascade来肩负,很三人会搅乱它们的含义和用法。

 
 那一个例子所用到的数据表是Person表和Card表,在这之中Person表里含有ID、Name和Phone字段,而Card表里包罗了CardID、PersonID、Bank和balance多少个字段。 
 

    在hibernate.cfg.xml文件里,通过mapping
resource来钦命相应的照耀文件,在那之中第一的代码如下:   

1 <!-- 添加实体类的映射文件-->
2 <mapping resource="Model/Card.hbm.xml" />
3 <mapping resource="Model/Person.hbm.xml" />

   
在Person.hbm.xml里,用如下代码来内定人(一方)和卡(多方)的关联,在那之中在人这一端,inverse是true。 
 

1 <set name="cards" cascade="save-update" inverse="true">
2 <key column="PersonID"/>
3 <one-to-many class="Card"/>
4 </set>

    在HibernateMain.java里,通过如下主要代码插入了一人的新闻。    

1 //创建一张卡
2 Card card1 = new Card();
3         card1.setCardID("Card123");
4         card1.setPersonID("Person123");
5         card1.setBank("Citi");
6         card1.setBalance(100f);
7 //初始化一个人
8         Person person = new Person();
9         person.setID("Person123");
10         person.setName("Peter");
11         person.setPhone("123456");
12 //在cards这个set里加入card1
13         Set<Card> cards = new HashSet<Card>();
14         cards.add(card1);
15         person.setCards(cards);
16 //保存人的信息
17         session.save(person);
18         session.flush();

   
运转后,在输出音信里能见到如下两条有关的插入语句:一条是插入Person音信,另一条是插入card消息。

1     Hibernate: insert into Person (Name, Phone, ID) values (?, ?, ?)

2     Hibernate: insert into Card (PersonID, Bank, Balance, Person,
CardID) values (?, ?, ?, ?, ?)

   
当把person.hbm.xml里的inverse设置成false时,能观六柱预测关的讲话里会多出一句update语句。

1     Hibernate: insert into Person (Name, Phone, ID) values (?, ?, ?)

2     Hibernate: insert into Card (PersonID, Bank, Balance, Person,
CardID) values (?, ?, ?, ?, ?)

3     Hibernate: update Card set PersonID=? where CardID=?

   
原因是,当设置inverse为true时,Person这一端反转外键调节权,也正是由卡德那端来保管外键,而在代码里大家无非是插入了Person,未有加塞儿Card,所以就从未有过立异八个外键(PersonID和CardID)的操作。相反,当inverse为false时,管理外键调整权是在Person端,那么当插入Person时,Hibernate就要求十二分的一句update语句来治本外键了。

   
在一对多的例子里,inverse不论取什么值,对结果都尚未影响,所以很轻松令人不经意它的功用。

   
在一对多的例子里,经常是让多方来治本外键调整权,例如一位有100张开,那么只要由Person方来保管的话,无形中恐怕会多出九十六个update操作,功用上就非常小好了。

   
假若在局地多案例中,inverse只是潜濡默化效能的话,那么在多对多的例子中,inverse的设置就只怕影响到多少。

   
大家再来看个多对多的学生选课案例,在那之中三个上学的儿童能够选多门课,而一门课里能够有八个学生。在Student.hbm.xml里,描述多对多关系的讲话里可拉长inverse=“true”的话语。 
 

1 <set name="courses" table="students_courses" inverse= "true" cascade="save-update">
2 <key column="student_id"></key>
3 <many-to-many class="Model.Course" column="course_id"></many-to-many>
4 </set>

   
在Course.hbm.xml里,不加任何关于inverse的言辞,也正是说,在Student端反转外键调控权,把调控权交到Course端。

    在HibernateMain这些类里,通过如下代码让s1上学的儿童选修Computer课程。     

1         //设置一个学生,学号是1
2 Student s1 = new Student();
3         s1.setStudentID("1");
4         s1.setStudentName("Peter");
5 //设置多个课程
6         Course c1 = new Course();
7         c1.setCourseID("c1");
8         c1.setCourseName("Math");
9         Course c2 = new Course();
10         c2.setCourseID("c2");
11         c2.setCourseName("Java");
12         Course c3 = new Course();
13         c3.setCourseID("c3");
14         c3.setCourseName("C#");
15 //设置计算机课程这个Set
16         Set<Course> computerCourses = new HashSet<Course>();
17         computerCourses.add(c2);
18         computerCourses.add(c3);
19 //让s1这个学生选修计算机课程(也就是c2和c3课程)
20         s1.setCourses(computerCourses);
21 //保存s1
22         session.save(s1);
23         session.flush();

   
实施结果是,纵然能在Student和Course表里看见有关的上学的小孩子和科指标记录,但在重要的描述学生选课关联表(students_courses)里,看不到任何涉及记录。原因是一度经过安装inverse把外键管理权交给Course方了,这里独有是保留学生,并未有保存课程,所以未有加塞儿外键的动作。要是要在students_courses表里插入外键关联,就必要在person.hbm.xml里设置inverse的值为false。

   
所以,在多对多关系里,设置错了inverse值会产生结果出错,请大家依照现实项指标场合卓越设值。

 

      

 

  

 

  

 

    

 

web轻量级开采面试科目,orminverse 本文来是从java
web轻量级开垦面试科目从摘录的。…

    本文来是从 java
web轻量级开拓面试科目从摘录的。

   
Inverse的斯洛伐克语含义是反转,在Hibernate中用来支配是由哪方来维护七个业务实体类之间的涉嫌关系,具体来讲,就是由哪方去设置这些被外键约束的字段值。

   
它的暗许值是false,也等于说,本端(比如inverse=false写在学生端,那么本端是学生,别的一方是学科)不“反转调整权”,这句别扭的话的另外一种说法是,本端维护关系关系。假诺两侧都不写,那么两端都维护。那样会产生难点,即新时因为两个都调整关系,由此可能会招致重复更新。

   
注意,inverse仅仅是点名由什么人来设置外键值,并不是用来设置级联操作,级联操作的法子由cascade来担负,很四个人会搅乱它们的意思和用法。

 
 这些事例所用到的数据表是Person表和Card表,个中Person表里带有ID、Name和Phone字段,而Card表里含有了CardID、PersonID、Bank和balance八个字段。 
 

    在hibernate.cfg.xml文件里,通过mapping
resource来钦定相应的映照文件,个中最主要的代码如下:   

1  <!-- 添加实体类的映射文件-->
2   <mapping resource="Model/Card.hbm.xml" />
3   <mapping resource="Model/Person.hbm.xml" />

   
在Person.hbm.xml里,用如下代码来钦赐人(一方)和卡(多方)的涉及,当中在人这一端,inverse是true。 
 

1  <set name="cards" cascade="save-update" inverse="true">
2   <key column="PersonID"/>
3   <one-to-many class="Card"/>
4   </set>

    在HibernateMain.java里,通过如下首要代码插入了一人的消息。    

1  //创建一张卡
2   Card card1 = new Card();
3           card1.setCardID("Card123");
4           card1.setPersonID("Person123");
5           card1.setBank("Citi");
6           card1.setBalance(100f);
7   //初始化一个人
8           Person person = new Person();
9           person.setID("Person123");
10          person.setName("Peter");
11          person.setPhone("123456");
12  //在cards这个set里加入card1
13          Set<Card> cards = new HashSet<Card>();
14          cards.add(card1);
15          person.setCards(cards);
16  //保存人的信息
17          session.save(person);
18          session.flush();

   
运营后,在出口新闻里能见到如下两条有关的插入语句:一条是插入Person新闻,另一条是插入card消息。

1     Hibernate: insert into Person (Name, Phone, ID) values (?, ?, ?)

2     Hibernate: insert into Card (PersonID, Bank, Balance, Person,
CardID) values (?, ?, ?, ?, ?)

   
当把person.hbm.xml里的inverse设置成false时,能看出有关的语句里会多出一句update语句。

1     Hibernate: insert into Person (Name, Phone, ID) values (?, ?, ?)

2     Hibernate: insert into Card (PersonID, Bank, Balance, Person,
CardID) values (?, ?, ?, ?, ?)

3     Hibernate: update Card set PersonID=? where CardID=?

   
原因是,当设置inverse为true时,Person这一端反转外键调控权,也正是由Card那端来管理外键,而在代码里大家只有是插入了Person,未有加塞儿卡德,所以就从不创新八个外键(PersonID和CardID)的操作。相反,当inverse为false时,管理外键控制权是在Person端,那么当插入Person时,Hibernate就须要额外的一句update语句来保管外键了。

发表评论

电子邮件地址不会被公开。 必填项已用*标注