休眠 - 添加关系(多对多)

时间:2014-09-14 09:35:44

标签: hibernate many-to-many

我有以下POJO:

@Entity(name = "member")
@Table(name = "member")
public class Member {
    @Column(name = "identifier")
    @Id
    @GeneratedValue
    private int mIdentifier;

    @Column(name = "name", columnDefinition = "text")
    private String mName;

    @ManyToMany(mappedBy = "mMembers")
    private Set<Project> mProjects = new HashSet<Project>();

    public int getIdentifier() {
        return mIdentifier;
    }

    public String getName() {
        return mName;
    }

    public void setName(final String pName) {
        mName = pName;
    }

    public Set<Project> getProjects() {
        return mProjects;
    }

    public Member() {
    }
}

@Entity(name = "project")
@Table(name = "project")
public class Project {
    @Column(name = "identifier")
    @Id
    @GeneratedValue
    private int mIdentifier;

    @ManyToMany(cascade = CascadeType.ALL)
    private Set<Member> mMembers = new HashSet<Member>();

    public int getIdentifier() {
        return mIdentifier;
    }

    public Set<Member> getMembers() {
        return mMembers;
    }

    public Project() {
    }
}

我想了解为什么会有效:

    Project project = new Project();
    Member member = new Member();

    member.setName("John Snow");
    project.getMembers().add(member);

    db.save(project);
    db.save(member);

我想了解为什么这不起作用:

    Project project = new Project();
    Member member = new Member();

    member.setName("John Snow");
    member.getProjects().add(project); // this is different

    db.save(project);
    db.save(member);

在第二个代码中,连接表中没有条目(在项目和成员之间)。

这里的常见做法是什么?

2 个答案:

答案 0 :(得分:0)

在双向关联中,始终存在所有者方和反方。

Hibernate只考虑所有者方。

所有者方是没有mappedBy属性的方。

通常的做法是通过向项目的项目添加成员来确保对象图是一致的。如果您只做一个,请确保更新所有者。

答案 1 :(得分:0)

未声明mappedBy的实体的另一方被视为该关联的所有者。

因此,您的代码mappedBy已在Member中声明,因此该关联的所有者为Project。因此,仅当您将Member's添加到Project's

时,才会保存关联