繁体   English   中英

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

[英]hibernate - add relation (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);

在第二个代码中,联接表中(项目和成员之间)没有添加任何条目。

这是什么惯例?

在双向关联中,总是有一个所有者方和一个反向方。

Hibernate仅考虑所有者方。

所有者端是不具有mappedBy属性的端。

通常的做法是,通过将一个成员添加到其项目中并将该项目添加到其成员中,来确保对象图是一致的。 如果您仅执行一项操作,请确保更新所有者。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM