JPA - 如何在不构造父对象的情况下构造ManyToOne关系的子对象

时间:2015-11-11 20:56:31

标签: java hibernate jpa optimization many-to-one

每次我写一个'创建'在DAO中的方法我必须使用注释@ManyToOne构造对象,当它们已经存在且我只有id。如下例所示。

我有班级员工:

@Entity  
public class Employee  
{  
    @Id
    private Long id;  

    private String employeeName;  

    @ManyToOne
    private Employer employer;  

    ...

}

在DAO中,我有一种使用现有雇主的id创建员工的方法。这就是我通常解决的问题:

public class EmployeeDAO {

    ...


    public void createEmployee(String name, String employerId) {

        Employee employee = new Employee();
        employee.setName(name);

        Employer employer = new Employer();
        employer.setId(employerId);
        employee.setEmployer(employer);

        save(employee);
    }

    ...
}

我想知道在没有制作新雇主的情况下是否有更优雅的方式做到这一点('

1 个答案:

答案 0 :(得分:3)

使用您的代码,如果您的雇主已经加载了持久性上下文,则可以获得NonUniqueObjectException

最好的方法是加载雇主的代理人。你可以使用:

来做到这一点
// for hibernate session
Employer employer = session.load(Employer.class, employerId);

// EntityManager
Employer employer = entityManager.getReference(Employer.class, employerId);

如果是Spring Data,请使用JpaRepository#getOne方法。

您可以阅读此question以获得更多解释。