hibernate annotation 之mappedBy 与 @JoinColumn区别
来源:互联网 发布:承德县德鸣大数据小镇 编辑:程序博客网 时间:2024/06/05 09:47
1.一对多的映射(one-to-many)
@Entity@Table(name="t_classroom")public class ClassRoom{ private int id; private String className; private Set<Student> students; @OneToMany(mappedBy="room") --->OneToMany指定了一对多的关系,mappedBy="room"指定了由多的那一方来维护关联关系,mappedBy指的是多的一方对一的这一方的依赖的属性,(注意:如果没有指定由谁来维护关联关系,则系统会给我们创建一张中间表) @LazyCollection(LazyCollectionOption.EXTRA) --->LazyCollection属性设置成EXTRA指定了当如果查询数据的个数时候,只会发出一条 count(*)的语句,提高性能 public Set<Student> getStudents() { return students; } }@Entity@Table(name="t_student")public class Student{ private int id; private String name; private int age; private ClassRoom room; @ManyToOne(fetch=FetchType.LAZY) ---> ManyToOne指定了多对一的关系,fetch=FetchType.LAZY属性表示在多的那一方通过延迟加载的方式加载对象(默认不是延迟加载) @JoinColumn(name="rid") --->通过 JoinColumn 的name属性指定了外键的名称 rid (注意:如果我们不通过JoinColum来指定外键的名称,系统会给我们声明一个名称) public ClassRoom getRoom() { return room; } }
在判断到底是谁维护关联关系时,可以通过查看外键,哪个实体类定义了外键,哪个类就负责维护关联关系。
2.一对一映射(One-to-One)
@Entity@Table(name="t_person")public class Person{ private int id; private String name; private IDCard card; @OneToOne(mappedBy="person") --->指定了OneToOne的关联关系,mappedBy同样指定由对方来进行维护关联关系 public IDCard getCard() { return card; }}@Entity@Table(name="t_id_card")public class IDCard{ private int id; private String no; private Person person; @OneToOne --->OnetoOne指定了一对一的关联关系,一对一中随便指定一方来维护映射关系,这里选择IDCard来进行维护 @JoinColumn(name="pid") --->指定外键的名字 pid public Person getPerson() { return person; } }
3.Many-to-Many映射(多对多映射关系)
3.1通过中间表由任一一个多的一方来维护关联关系
@Entity@Table(name="t_teacher")public class Teacher{ private int id; private String name; private Set<Course> courses; @ManyToMany(mappedBy="teachers") --->表示由Course那一方来进行维护 public Set<Course> getCourses() { return courses; } }@Entity@Table(name="t_course")public class Course{ private int id; private String name; private Set<Teacher> teachers; @ManyToMany ---> ManyToMany指定多对多的关联关系 @JoinTable(name="t_teacher_course", joinColumns={ @JoinColumn(name="cid")}, inverseJoinColumns={ @JoinColumn(name = "tid") }) --->因为多对多之间会通过一张中间表来维护两表直接的关系,所以通过 JoinTable 这个注解来声明,name就是指定了中间表的名字,JoinColumns是一个 @JoinColumn类型的数组,表示的是我这方在对方中的外键名称,我方是Course,所以在对方外键的名称就是 rid,inverseJoinColumns也是一个 @JoinColumn类型的数组,表示的是对方在我这放中的外键名称,对方是Teacher,所以在我方外键的名称就是 tid public Set<Teacher> getTeachers() { return teachers; }}
3.2 将Many-to-Many拆分成两个One-to-Many的映射(Admin、Role、AdminRole)
@Entity@Table(name="t_admin")public class Admin{ private int id; private String name; private Set<AdminRole> ars; public Admin() { ars = new HashSet<AdminRole>(); } public void add(AdminRole ar) { ars.add(ar); } @OneToMany(mappedBy="admin") --->OneToMany关联到了AdminRole这个类,由AdminRole这个类来维护多对一的关系,mappedBy="admin" @LazyCollection(LazyCollectionOption.EXTRA) public Set<AdminRole> getArs() { return ars; } }@Entity@Table(name="t_role")public class Role{ private int id; private String name; private Set<AdminRole> ars; public Role() { ars = new HashSet<AdminRole>(); } public void add(AdminRole ar) { ars.add(ar); } @OneToMany(mappedBy="role") --->OneToMany指定了由AdminRole这个类来维护多对一的关联关系,mappedBy="role" @LazyCollection(LazyCollectionOption.EXTRA) public Set<AdminRole> getArs() { return ars; } }@Entity@Table(name="t_admin_role")public class AdminRole{ private int id; private String name; private Admin admin; private Role role; @ManyToOne ---> ManyToOne关联到Admin @JoinColumn(name="aid") public Admin getAdmin() { return admin; } @ManyToOne ---> @JoinColumn(name="rid") public Role getRole() { return role; } }
通过hibernate来进行插入操作的时候,不管是一对多、一对一还是多对多,都只需要记住一点,在哪个实体类声明了外键,就由哪个类来维护关系,
在保存数据时,总是先保存的是没有维护关联关系的那一方的数据,后保存维护了关联关系的那一方的数据,如:
Person p = new Person();p.setName("xiaoluo");session.save(p); IDCard card = new IDCard();card.setNo("1111111111");card.setPerson(p);session.save(card);
以上内容整理从http://www.cnblogs.com/xiaoluo501395377/p/3374955.html,在此谢过博主
0 0
- hibernate annotation 之mappedBy 与 @JoinColumn区别
- hibernate annotation 之mappedBy 与 @JoinColumn区别
- Hibernate中@OneToMany与ManyToOne的mappedBy和@JoinColumn区别
- @JoinColumn 与mappedBy
- Hibernate的注解中的mappedBy和JoinColumn的区别
- Hibernate Annotation @mappedBy含义
- Hibernate Annotation @mappedBy含义
- Hibernate @OneToMany的mappedBy和@JoinColumn总结
- Hibernate Annotation mappedBy注解理解
- Understanding mappedBy annotation in Hibernate
- Hibernate Annotation mappedBy注解理解
- Hibernate中,mappedBy和注解@JoinColumn的对比
- Hibernate中,mappedBy和注解@JoinColumn的对比
- Hibernate中mappedBy和@JoinColumn二者的使用心得
- Hibernate中,mappedBy和注解@JoinColumn的对比
- mappedBy跟JoinColumn/JoinTable
- mappedBy跟JoinColumn/JoinTable
- mappedBy跟JoinColumn/JoinTable .
- 工程中应用到的数字电路mos型和ttl型的门电路使用注意事项
- mssql有趣的注入 - niexinming
- 对List<T> 随机排序
- Poj 2983 Is the Information Reliable?
- android 中向手机端安装apk 的时候报出 INSTALL_FAILED_INSUFFICIENT_STORAGE 错误的解决方法
- hibernate annotation 之mappedBy 与 @JoinColumn区别
- Volley之https相关
- SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'customer' cannot be null
- ajax跨域问题
- vim基本命令
- 开始学习PHP
- CMake 基本使用方法--写CMakeList.txt,Compile ROS package
- 自适应网页设计
- 【jQuery】onload事件,load(),ready()比较和使用