2016-11-30 87 views
0

假設我有一個單向的許多一對多的關係:JPA - 使用現有實體時是否需要多對多級聯?

@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; 
    ... 
} 

將下列插入到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); 

如果我還想更新角色集合並刷新更改,該怎麼辦?例如刪除一個角色或添加另一個角色。

回答

0

簡短的回答是否定的。

朗答案是每個表是CRUD獨特。

例如: 如果文檔表有一個列id_role,它是角色表的外鍵,並且您更新了此數據,持久性文檔將更新此列,因爲它是Document表的屬性,所以它不會對Role對象執行任何操作。

+0

謝謝您的回答,但在這種情況下,沒有DocumentRole實體,如果這就是你說的話,你可能已經注意到了關聯映射與@JoinTable,所以我試圖找到解釋了一些官方規格當沒有定義級聯時,多對多關聯表(document_id,role_id)會發生什麼情況。 –

+0

@MichalisDaniilakis是的,我讀錯,我去編輯答案,但作爲FAS你問JPA只更新實體屬性欄,如果你更新文檔不相關的實體,僅文件被更新,也沒有作用,因爲你不沒有級聯http://stackoverflow.com/questions/15835741/jpa-update-doesnt-work-in-a-many-to-many-relationship – karelss

相關問題