many to one

我不是女神ヾ 2022-08-19 12:22 211阅读 0赞

举例如下:

1.Group.java

[java] view plain copy print ?

  1. package edu.study.hibernate;
  2. public class Group {
  3. private int id;
  4. private String name;
  5. public int getId() {
  6. return id;
  7. }
  8. public void setId(int id) {
  9. this.id = id;
  10. }
  11. public String getName() {
  12. return name;
  13. }
  14. public void setName(String name) {
  15. this.name = name;
  16. }
  17. }

2.User.java

[java] view plain copy print ?

  1. package edu.study.hibernate;
  2. public class User {
  3. private int id;
  4. private String name;
  5. private Group group;
  6. public int getId() {
  7. return id;
  8. }
  9. public void setId(int id) {
  10. this.id = id;
  11. }
  12. public String getName() {
  13. return name;
  14. }
  15. public void setName(String name) {
  16. this.name = name;
  17. }
  18. public Group getGroup() {
  19. return group;
  20. }
  21. public void setGroup(Group group) {
  22. this.group = group;
  23. }
  24. }

3.Group.hbm.xml配置文件

[html] view plain copy print ?

  1. <?xml version=”1.0”?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. “-//Hibernate/Hibernate Mapping DTD 3.0//EN”
  4. “http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

4.User.hbm.xml配置文件

[html] view plain copy print ?

  1. <?xml version=”1.0”?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. “-//Hibernate/Hibernate Mapping DTD 3.0//EN”
  4. “http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

5.hibernate.cfg.xml配置文件

[html] view plain copy print ?

  1. <!DOCTYPE hibernate-configuration PUBLIC
  2. “-//Hibernate/Hibernate Configuration DTD 3.0//EN”
  3. “http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
  4. jdbc:mysql://127.0.0.1/hibernate_many2one
  5. com.mysql.jdbc.Driver
  6. root
  7. root
  8. org.hibernate.dialect.MySQLDialect
  9. true

6.测试代码

[java] view plain copy print ?

  1. Group group=new Group();
  2. group.setName(“研发部”);
  3. User u1=new User();
  4. u1.setName(“小黄”);
  5. u1.setGroup(group);
  6. User u2=new User();
  7. u2.setName(“小张”);
  8. u2.setGroup(group);
  9. session.save(u1);
  10. session.save(u2);

如果没使用cascade属性,会抛出TransientObjectException异常,因为Group为transient状态,User为persistent状态,而persistent状态对象不能引用transient状态对象,因此会抛出异常。正确的如下:

[java] view plain copy print ?

  1. Group group=new Group();
  2. group.setName(“研发部”);
  3. //首先要保存Group
  4. session.save(group);
  5. User u1=new User();
  6. u1.setName(“小黄”);
  7. u1.setGroup(group);
  8. User u2=new User();
  9. u2.setName(“小张”);
  10. u2.setGroup(group);
  11. //可以正确存储
  12. session.save(u1);
  13. session.save(u2);

注意:没有使用cascade属性的前提下,首先存储Group,则Group对象成为了persistent状态,从而当persistent状态的User对象对其引用时,不会抛出异常。

如果采用了级联,即

[html] view plain copy print ?

cascade属性进行了设置,即使不首先保存Group,也不会抛出异常,并正确存储。

[java] view plain copy print ?

  1. Group group=new Group();
  2. group.setName(“研发部”);
  3. User u1=new User();
  4. u1.setName(“小黄”);
  5. u1.setGroup(group);
  6. User u2=new User();
  7. u2.setName(“小张”);
  8. u2.setGroup(group);
  9. session.save(u1);
  10. session.save(u2);

因为采用了级联cascade属性,会首先保存Group,所以不会抛出异常。

总结:

(1)多对一映射:会在多的一端(User)加入外键,指向一的一端(Group),外键的定义由column属性决定,如果没有该属性,默认的外键与实体的属性一致。如

[html] view plain copy print ?

(2)cascade:级联的意思是指定两个对象之间的操作联动关系,对一个对象执行了操作之后,对其指定的级联对象也需要执行相同的操作。

  1. 其属性值如下:
  2. all:在所有的情况下都执行级联操作;
  3. none:在所有情况下都不执行级联操作;
  4. save-update:在保存和更新的时候执行级联操作;
  5. delete:在删除的时候执行级联操作。

发表评论

表情:
评论列表 (有 0 条评论,211人围观)

还没有评论,来说两句吧...

相关阅读

    相关 hibernate:many to one

    这里就拿练手的图书馆系统来说吧… 这个案例用到其中的表 tb\_book 图书信息表 ![这里写图片描述][SouthEast] tb\_bookcase 书架

    相关 Hibernate Many-to-Many

    声明:本博文用于学习总结及工作心得 在使用hibernate时,经常会遇到对象与对象之间的关系映射,比如一对多,多对一,多对多;这里来聊一下多对多的配置文件