Hibernate 如何在Spring数据JPA中插入对象时添加引用表Id
我一直在玩JPA,遇到了这个场景,想知道如何解决这个问题 我有两张桌子,即公司和员工。 所以这里一个员工只能为一家公司工作,所以@OneToOne单向映射是在employee类中完成的。并且公司表中的公司详细信息已经存在 因此,当我尝试将记录插入Employee表时,我甚至创建了对公司的引用,将其添加到Employee类中,并使用EmployeeRepository的save方法保存它。因为company_id已经存在于company表中,所以它应该只引用它,而不是创建一个新的company。但这并没有发生。 我得到一个异常,说Hibernate 如何在Spring数据JPA中插入对象时添加引用表Id,hibernate,spring-data,spring-data-jpa,Hibernate,Spring Data,Spring Data Jpa,我一直在玩JPA,遇到了这个场景,想知道如何解决这个问题 我有两张桌子,即公司和员工。 所以这里一个员工只能为一家公司工作,所以@OneToOne单向映射是在employee类中完成的。并且公司表中的公司详细信息已经存在 因此,当我尝试将记录插入Employee表时,我甚至创建了对公司的引用,将其添加到Employee类中,并使用EmployeeRepository的save方法保存它。因为company_id已经存在于company表中,所以它应该只引用它,而不是创建一个新的company。但
公司对象仍处于瞬态。
我可以通过添加级联类型来解决这个问题。所有但是我不需要插入公司,我只需要将公司链接到员工
下面是代码片段
雇员阶级
@Entity
@Table(name = "employee")
@Setter
@Getter
public class Employee
{
@Id
@GeneratedValue
private Long id;
@Column(name = "employee_id")
private Integer employeeId;
@Column(name = "employee_name")
private String employee_name;
@OneToOne
@JoinColumn(name = "company_id")
private Company company;
}
公司级
@Entity
@Table(name = "company")
@Setter
@Getter
public class Company
{
@Id
@GeneratedValue
@Column(name = "company_id")
private Long id;
@Column(name = "company_name")
private String companyName;
}
公司表
company_id company_name
1 Dell
2 Apple
3 Microsoft
下面是我如何创建Employee对象的
Employee emp = new Employee();
emp.setEmployeeId(10);
emp.setEmployeeName("Michael");
Company company = new Company();
company.setId(1);
emp.setCompany(company);
employeeRepository.save(emp);
请告诉我如何将company类链接到employee类,而不是保存一个以上的公司。假设公司可能有多个员工
关系是一个多人
,而不是一人
如果要引用现有实体,请加载该实体,而不是创建新实体:
Employee emp = new Employee();
// ...
emp.setCompany(companyRepository.findById(1));
employeeRepository.save(emp);
对我来说,最好的解决方案是在你的公司中延迟加载一个代理。要使用SpringDataJPA,您需要使公司存储库扩展JpaRepository
。允许您访问该方法的:
如果给定id没有公司,则抛出EntityNotFoundException
使用代理,在大多数情况下可以避免对数据库的请求,因为Hibernate使用其缓存来检查公司的存在。但是如果我的内存正常,Hibernate会在每次调用代理的getter时向数据库发出请求,除了getId()
。因此,在您的情况下,这是一个很好的解决方案,但不要总是使用它
Employee emp = new Employee();
emp.setEmployeeId(10);
emp.setEmployeeName("Michael");
emp.setCompany(companyRepository.getOne(1))
employeeRepository.save(emp);