JPA关系模型——一对一及一对多关系

一对一关系

前面说到JPA关系模型有好几种,今天就举例说明关系模型中的一对一关系。在JPA(Java持久化API)中,可以使用注解来表示一对一关系。举例如下:

首先,我们有两个实体类,UserUserProfile,它们之间是一对一的关系。

@Entity 
@Table(name = "users") 
public class User 
{ 
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
 private Long id; private String username; 
@OneToOne(mappedBy = "user") 
private UserProfile userProfile; 
// 构造函数、getter和setter方法等省略 } 
@Entity @Table(name = "user_profiles")


 public class UserProfile 
{ 
@Id 
private Long id;
private String firstName; 
private String lastName; 
@OneToOne @JoinColumn(name = "user_id") 
private User user; 
// 构造函数、getter和setter方法等省略 
}

User实体类中,使用@OneToOne(mappedBy = "user")注解表示与UserProfile实体类的关系,mappedBy属性指定了关系维护的端,即UserProfile类中的user属性。

UserProfile实体类中,使用@OneToOne注解表示与User实体类的关系,@JoinColumn注解指定了外键列的名称,这里使用了user_id

接下来,我们可以使用JPA进行数据库操作,例如保存和查询一对一关系的数据:

 

EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("YourPersistenceUnit");
EntityManager entityManager = entityManagerFactory.createEntityManager();
 // 创建User对象 
User user = new User();
 user.setUsername("john_doe"); 
// 创建UserProfile对象 
UserProfile userProfile = new UserProfile(); 
userProfile.setFirstName("John"); userProfile.setLastName("Doe"); 
// 建立关系 
user.setUserProfile(userProfile); 
userProfile.setUser(user);
 // 保存数据 
entityManager.getTransaction().begin(); 
entityManager.persist(user); 
entityManager.persist(userProfile); 
entityManager.getTransaction().commit(); 
// 查询数据 
User savedUser = entityManager.find(User.class, user.getId());
 UserProfile savedProfile = savedUser.getUserProfile(); System.out.println(savedUser.getUsername()); System.out.println(savedProfile.getFirstName()); System.out.println(savedProfile.getLastName()); entityManager.close(); entityManagerFactory.close();

上述代码中,我们首先创建了一个User对象和一个UserProfile对象,并建立了它们之间的关系。然后,通过调用EntityManagerpersist()方法将它们保存到数据库中。但是不建议我们在实际中直接使用entityManage,因为有太多的细节需要我们自己把控!

最后,我们使用find()方法查询保存的数据,并输出用户名和用户配置文件的信息。

 一对多关系

通过前面几篇文章的学习,我们了解到了JPA的几种关系模型,并举例说明了一对一的关系模型。下面就举个简单例子说明一下一对多的关系模型,也是我们在实际开发中用的最多的一种。

假设我们有两个实体类,Department和Employee,它们之间是一对多的关系,一个部门可以有多个员工。

@Entity

@Table(name = "departments")

public class Department {

    @Id

    @GeneratedValue(strategy = GenerationType.IDENTITY)

    private Long id;

    private String name;

    @OneToMany(mappedBy = "department")

    private List<Employee> employees;

    // 构造函数、getter和setter方法等省略

}



@Entity

@Table(name = "employees")

public class Employee {

    @Id

    @GeneratedValue(strategy = GenerationType.IDENTITY)

    private Long id;

    private String name

    @ManyToOne

    @JoinColumn(name = "department_id")

    private Department department;

    // 构造函数、getter和setter方法等省略

}

在Department实体类中,使用@OneToMany(mappedBy = "department")注解表示与Employee实体类的关系,mappedBy属性指定了关系维护的端,即Employee类中的department属性。

在Employee实体类中,使用@ManyToOne注解表示与Department实体类的关系,@JoinColumn注解指定了外键列的名称,这里使用了department_id。

接下来,我们可以使用JPA进行数据库操作,例如保存和查询一对多关系的数据:

EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("YourPersistenceUnit");

EntityManager entityManager = entityManagerFactory.createEntityManager();



// 创建Department对象

Department department = new Department();

department.setName("IT Department");



// 创建Employee对象

Employee employee1 = new Employee();

employee1.setName("John Doe");

employee1.setDepartment(department);



Employee employee2 = new Employee();

employee2.setName("Jane Smith");

employee2.setDepartment(department);



// 建立关系

department.setEmployees(Arrays.asList(employee1, employee2));


// 保存数据

entityManager.getTransaction().begin();

entityManager.persist(department);

entityManager.persist(employee1);

entityManager.persist(employee2);

entityManager.getTransaction().commit();


// 查询数据

Department savedDepartment = entityManager.find(Department.class, department.getId());

List<Employee> employees = savedDepartment.getEmployees();

for (Employee employee : employees) {

    System.out.println(employee.getName());

}


entityManager.close();

entityManagerFactory.close();

上述代码中,我们首先创建了一个Department对象和两个Employee对象,并建立了它们之间的关系。然后,通过调用EntityManager的persist()方法将它们保存到数据库中。

最后,我们使用find()方法查询保存的数据,并遍历打印部门中的员工名字。

上面只是一个很简单的实例。我们在实际的工作中基本也不会遇到这种,。但是不管多么复杂都是按照这个套路来就行。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

枫飞雪飘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值