Hibernate 如何在Spring数据JPA中插入对象时添加引用表Id

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。但

我一直在玩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);