一对多单向:
import java.util.Set; import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.OneToMany; @Entity public class Department { private long id; private String name; private Set<Employee> emps; @Id @GeneratedValue public long getId() { return id; } public void setId(long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @OneToMany(cascade = CascadeType.ALL) @JoinColumn(name = "dept_id")//不加该注解,则会生成中间表。加上该注解则会在多方的表中生成一列"dept_id" public Set<Employee> getEmps() { return emps; } public void setEmps(Set<Employee> emps) { this.emps = emps; } }
import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Transient; @Entity public class Employee { private long id; private Department depart; private String name; @Id @GeneratedValue public long getId() { return id; } public void setId(long id) { this.id = id; } @Transient//不插入数据库 public Department getDepart() { return depart; } public void setDepart(Department depart) { this.depart = depart; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
注意上面这个注解,在被维护方(一方)的@JoinColumn要name是维护方以数据库表形式存在的ID,除了有一个@JoinColumn外也可以有一个referencedColumnName这个属性
上面是一对多其中一种方式,另外一种就是在维护端设计关联关系,代码如下:
import java.util.Set; import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.OneToMany; @Entity public class Department { private long id; private String name; @Id @GeneratedValue public long getId() { return id; } public void setId(long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Transient; @Entity public class Employee { private long id; private Department depart; private String name; @Id @GeneratedValue public long getId() { return id; } public void setId(long id) { this.id = id; } @ManyToOne(cascade={CascadeType.PERSIST, CascadeType.MERGE}, fetch=FetchType.LAZY) @JoinColumn(name="dept_id") public Department getDepart() { return depart; } public void setDepart(Department depart) { this.depart = depart; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
其实一对多就是在多的一方也就是维护方建立关联少一个的关联关系(一般是通过外键ID)
一对多双向:
import java.util.Set; import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.OneToMany; @Entity public class Department { private long id; private String name; private Set<Employee> emps; @Id @GeneratedValue public long getId() { return id; } public void setId(long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @OneToMany(mappedBy="depart",cascade=CascadeType.ALL,fetch=FetchType.EAGER) public Set<Employee> getEmps() { return emps; } public void setEmps(Set<Employee> emps) { this.emps = emps; } }
import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Transient; @Entity public class Employee { private long id; private Department depart; private String name; @Id @GeneratedValue public long getId() { return id; } public void setId(long id) { this.id = id; } @ManyToOne(cascade={CascadeType.PERSIST, CascadeType.MERGE}, fetch=FetchType.LAZY) @JoinColumn(name="dept_id") public Department getDepart() { return depart; } public void setDepart(Department depart) { this.depart = depart; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
一对多双向关联,其实也是在维护端设置关联关系。
相关推荐
本篇文章将深入探讨Hibernate中注解的一对多、多对多和一对一关系映射。 ### 一对多关系 在现实生活中,例如一个班级有一个班主任,而班主任可以管理多个学生,这就是典型的“一对多”关系。在Hibernate中,我们...
在Hibernate中,一对一关联映射分为单向和双向。单向一对一映射通常涉及一个实体持有另一个实体的引用,而双向一对一映射则意味着两个实体都可以互相引用。这种关联关系在数据库层面通常通过主键外键约束来实现,但...
2. **集合映射**:通过一对多、多对一、多对多等关联关系,将集合属性与数据库表建立联系。 3. **排序集合**:对于需要按特定顺序存储的集合,可以使用排序集合(Sorted Collection)。 4. **双向关联**:在实体类...
在单向一对多关系中,一个实体(父实体)可以有多个其他实体(子实体)的引用,但子实体并不知道它们属于哪个父实体。例如,一个班级有多个学生,但学生并不知道他们属于哪个班级。配置时,使用`@OneToMany`注解在父...
“Hibernate 一对多,多对一,一对多双向关联”是指在Java持久化框架Hibernate中,实体间常见的三种关联关系。在数据库设计中,这种关联关系是常见的,例如一个用户可以有多个订单(一对多),一个订单对应一个用户...
本篇将详细探讨"一对多单向和双向映射"这一主题,结合标签中的"源码"和"工具",我们将深入理解这些概念,并可能涉及到具体的代码实现。 首先,映射是ORM框架的核心,它允许开发者将数据库表与Java类之间的关系进行...
2. 创建双向一对多关联,如“街道”和“区县”的双向关系。 3. 实现多对多关联,例如OA系统中项目和人员的对应关系管理。 在实体类中,我们可以使用注解或XML映射文件来定义关联。例如,在上述的“区县”和“街道”...
1. 避免单向一对多,使用双向一对多关联。 2. 灵活使用单向一对多,减少不必要的对象加载。 3. 尽量用多对一替换一对一,以减少冗余。 4. 配置对象缓存,避免使用集合缓存,减少内存消耗。 5. 使用Bag表示一对多集合...
在Hibernate中,关系注解用于在实体类中定义不同类型的数据库关系,如一对一、一对多、多对多等。以下是关于Hibernate关系注解的详细说明: 1. **一对一外键关联映射(单向)** 使用`@OneToOne`注解实现一对一关系...
3. **一对多关联**:例如,一个部门可以有多个员工,这可以通过在部门类上使用`@OneToMany`注解和在员工类上使用`@ManyToOne`注解来建立。`@JoinColumn`或`@JoinTable`用于指定关系。 4. **多对多关联**:当两个...
本文主要探讨的是Hibernate中的两种关联关系:多对一单向关联和多对一双向关联。通过理解这两种关联方式,我们可以更好地设计和实现复杂的数据库模型。 首先,我们来看**多对一单向关联**。这种关联意味着一个实体...
本篇文章将详细讲解"hibernate一对多与多对一"的关系映射概念,以及如何在实际开发中进行配置和使用。 首先,我们来看一下“一对多”关系。在现实世界中,这种关系可以对应到例如一个班级有多个学生,或者一个人...
在这个“hibernate实例(一对多,多对一)”的主题中,我们将深入探讨两种重要的关联关系:一对一(One-to-One)和一对多(One-to-Many)。 **一对一关联(One-to-One)** 在一对一关联中,一个实体与另一个实体之间...
首先,`@OneToMany`注解用于表示一对多的关联关系,比如一个班级可以有多个学生。在单向关联中,我们通常在拥有“多”的那一方(例如班级)的实体类中使用`@OneToMany`,并使用`@JoinColumn`来指定外键字段。`...
本文主要关注Hibernate中的一个核心概念——一对一(One-to-One)、一对多(One-to-Many)和多对一(Many-to-One)关联映射,特别是关于“一到多”单向和双向关联映射的配置心得。 首先,让我们了解“一到多”关联...
`@OneToMany`表示一对多关联,一个实体类可以有多个其他实体类的实例。 ```java @Entity public class Customer { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @OneToMany...