JPA - 在使用现有实体时,我是否需要多对多级联?

时间:2016-11-30 16:11:55

标签: java hibernate jpa many-to-many

假设我有一个单向的多对多关系:

@Entity
@Table(name = "document")
public class Document {

    private Integer id;
    private Set<Role> roles;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    @ManyToMany(fetch = FetchType.LAZY)
    @JoinTable(name = "document_role", 
        joinColumns = {@JoinColumn(name = "Document_Id")}, 
        inverseJoinColumns = {@JoinColumn(name = "Role_Id")})
    public Set<Role> getRoles() {
        return roles;
    }

    public void setRoles(Set<Role> roles) {
        this.roles = roles;
    }
}

@Entity
@Table(name = "role")
public class Role {

    private Integer id;
    ...
}

如果没有定义Cascade类型并且假设不需要创建新的Role实体,那么下面是否会插入document_role?

Role role1 = em.find(Role.class, 1);
Role role2 = em.find(Role.class, 2);
Role role3 = em.find(Role.class, 3);

Set<Role> roles = new HashSet<>();
roles.add(role1);
roles.add(role2);
roles.add(role3);

Document document = new Document();
document.setRoles(roles);

// Save document, will that save the association?
em.persist(document);

如果我还想更新角色集合并刷新更改,该怎么办?例如删除一个角色或添加另一个角色。

1 个答案:

答案 0 :(得分:0)

简短的回答是否定的。

长答案是每个表对于CRUD都是唯一的。

实施例: 如果文档表的列id_role是角色表的外键,并且您更新了此数据,则持久化文档将更新此列,因为它是Document表的属性,它对Role对象不起任何作用。