2011-07-11 53 views
1

我有@ManyToMany關係AuthorSource實體,其中Author是擁有實體。當我刪除作者時,一切正常,休眠生成Hibernate: delete from author_source where author=?。但是,當我刪除源,Hibernate生成相同的查詢authorIdauthor_source表中每個出現與刪除的源連接。因此,此查詢還會刪除其他來源之間的連接(如果作者有兩個來源,則兩個連接都將被刪除)。Hibernate @ManyToMany只使用擁有表中的FK來刪除連接表中的條目

作者單位:

@Entity 
@Table(name = "author") 
public class Author implements Serializable { 

    @Id 
    @Column(name = "authorId") 
    @GeneratedValue 
    private Integer authorId; 

    @SourceFormat // own formatter 
    @ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL) 
    @JoinTable(
      name = "author_source", 
      joinColumns = { @JoinColumn(name = "author") }, 
      inverseJoinColumns = { @JoinColumn(name = "source") } 
    ) 
    private Set<Source> sources; 
} 

源實體:

@Entity 
@Table(name = "source") 
public class Source implements Serializable { 

    @Id 
    @Column(name = "sourceId") 
    @GeneratedValue 
    private Integer sourceId; 

    @ManyToMany(fetch = FetchType.EAGER, mappedBy = "sources") 
    private Set<Author> authors; 
} 

我想Hibernate的生成

delete from author_source where author=? 

查詢時,我刪除作者,

delete from author_source where source=? 

當我刪除源。是否可以或應該手動執行?

回答

0

也許嘗試在兩個實體中定義連接表。

確保joinColumn和inverseJoinColumn在關係的相對兩側是相反的。

  • 在一側== inverseJoinColumn joinColumn上另一側
  • inverseJoinColumn在一側== joinColumn上另一側

@Entity 
@Table(name = "author") 
public class Author extends Serializable { 

    ... 

    @ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL) 
    @JoinTable(name="author_source", 
     [email protected](name="author_id"), 
     [email protected](name="source_id") 
) 
    private Set<Source> sources; 

} 

@Entity 
@Table(name = "source") 
public class Source extends Serializable { 

    ... 

    @ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL) 
    @JoinTable(name="author_source", 
     [email protected](name="source_id"), 
     [email protected](name="author_id") 
) 
    private Set<Author> authors; 

} 
+0

您確定'CascadeType.DELETE_ORPHAN'?它只是刪除所有與任何作者無關的來源。 (試用'@Cascade(CascadeType.DELETE_ORPHAN)') – kurochenko

+0

Kurochenko:是不是你想要達到的目標?當您刪除作者時,與該作者相關的所有來源將成爲孤兒並將被刪除。但是,當您刪除源並且作者有其他子源時,作者將不會被刪除,這是我的要求。 –

+0

好吧,不。我可能錯誤地解釋了ID。當我刪除作者時,Hibernate根據author_source.author從author_source中刪除(並且保持源表不變)。沒關係。但是當我刪除源代碼時,它也會根據author_source.author從author_source中刪除,而不是根據author_source.source(請參閱上述生成的SQL命令)。這可能會導致作者和其他來源之間的連接被不必要地移除。 – kurochenko

相關問題