Java JPA-创建或使用外键

Java JPA-创建或使用外键,java,hibernate,jpa,Java,Hibernate,Jpa,好的,我有两个实体-: 教师 部门 一名教师可以属于一个部门,一个部门可以有许多教师 因此,要求教师实体包含映射关系的mappedBy属性 现在我面临的问题是,如果一个部门不存在,那么它就会被创建,如果不存在,一个查询就会获取该部门,并在teacher对象中使用该部门 现在的问题是,如果该部门存在,我必须使用merge,如果不存在,我必须使用persist,因为该部门将被新插入。我能做些什么来允许动态使用merge或persist吗 代码如下-: Department.java @Entity

好的,我有两个实体-:

教师 部门 一名教师可以属于一个部门,一个部门可以有许多教师

因此,要求教师实体包含映射关系的mappedBy属性

现在我面临的问题是,如果一个部门不存在,那么它就会被创建,如果不存在,一个查询就会获取该部门,并在teacher对象中使用该部门

现在的问题是,如果该部门存在,我必须使用merge,如果不存在,我必须使用persist,因为该部门将被新插入。我能做些什么来允许动态使用merge或persist吗

代码如下-:

Department.java

@Entity
@Table (name = "DEPARTMENTS")
@NamedQueries({
    @NamedQuery(name = "Department.findById",
            query = "SELECT d FROM "
                    + "Department d "
                    + "WHERE d.deptId = :id")
})
public class Department extends STSEntity{

    private static final long serialVersionUID = 1L;

    @Column (name = "DEPT_ID", length = 10, 
            unique = true, nullable = false)
    private String deptId;

    @OneToMany (targetEntity = Teacher.class, 
            mappedBy = "dept")
    private Collection<Teacher> teachers = new ArrayList<>();
反正我两个都可以用?任何帮助都将不胜感激


基本上,如果外键存在,请使用它或以其他方式创建它。

为什么不使用merge并让JPA确定它是否需要插入或更新?@Chris merge仅在有部门存在时才起作用。否则,如果我尝试持久化多个教师,它将尝试持久化部门的重复值。合并第一个教师后,使用合并教师中的部门,并在其他教师上使用该部门。应设置关系的两侧,以便所有新教师实例都关联到同一现有部门。如果将CascadeType.Merge添加到department.teachers关系中,则只需合并部门即可将所有新教师插入数据库。
@Entity
@Table (name = "TEACHER_DATA")
@NamedQueries ( {
    @NamedQuery(name = "Teacher.getByDept",
            query = "SELECT t "
                    + "FROM Teacher t "
                    + "WHERE t.dept = :dept")
})
public class Teacher extends STSEntity {


    private static final long serialVersionUID = 1L;

    @Column (name = "TEACHER_ID", unique = true, nullable = false, length = 10)
    private String teacherId;

    @ManyToOne (targetEntity = Department.class, 
            fetch = FetchType.EAGER,
            cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH})
    @JoinColumn (name = "DEPT_ID", nullable = false)
    private Department dept;