2013-02-21 235 views
2

我有一個對象持有3集合。這些集合中的對象繼承了相同的超類。休眠一對多集合刪除

我使用SingleTable繼承與@ForceDiscriminator。

該集合是單向的一對多。

當我清除其中一個集合時,另外兩個將它們的外鍵鏈接鬆開到保持對象。

我在WebSphere 7(帶有JPA2.0功能包)容器中使用Hibernate 3.5.3。

實體

@Entity 
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 
@Table(name="PLANUNG") 
@DiscriminatorColumn(name="DISC", discriminatorType=DiscriminatorType.STRING) 
@DiscriminatorValue("dummy") 
@ForceDiscriminator 
public abstract class Planung extends EntityBase { 

@Column(name = "JAHR", nullable=false) 
private int jahr; 

@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch=FetchType.EAGER) 
@JoinColumn(name="PLANUNG_ID", referencedColumnName="id") 
@OrderBy("id ASC") 
private List<Werte> Werte; 

[...] 

@Entity 
@DiscriminatorValue(PlanungA.NAME) 
public class PlanungA extends Planung { 
    public static final String NAME = "PlanungA"; 
} 
@Entity 
@DiscriminatorValue(PlanungB.NAME) 
public class PlanungB extends Planung { 
    public static final String NAME = "PlanungB"; 
} 
@Entity 
@DiscriminatorValue(PlanungC.NAME) 
public class PlanungC extends Planung { 
    public static final String NAME = "PlanungC"; 
} 


--- 

@Entity 
@DiscriminatorValue(Base.NAME) 
public class Base extends AbstractBase { 
public static final String NAME = "Base"; 

@OrderBy("jahr ASC") 
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) 
@JoinColumn(name="BASE_ID", referencedColumnName="id") 
private List<PlanungA> planungA; 

@OrderBy("jahr ASC") 
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) 
@JoinColumn(name="BASE_ID", referencedColumnName="id") 
private List<PlanungB> planungB; 

@OrderBy("jahr ASC") 
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) 
@JoinColumn(name="BASE_ID", referencedColumnName="id") 
private List<PlanungC> planungC; 

[...] 

應用程序代碼

List list = base.getPlanungA(); 
list.clear(); 

問題

除了其他的語句Hibernate的問題,這個SQL:

update 
    PLANUNG 
set 
    BASE_ID=null 
where 
    BASE_ID=? 

因此,所有集合(PlanungA,B,C)都不參考Base對象。

判別符丟失(例如AND DISC ='PlanungA')。

我已經嘗試過

  • 我已經升級到Hibernate 3.6.10.Final(只是嘗試)。它沒有解決這個問題。
  • 全球範圍內搜索...

任何幫助,指點我類似的問題等是極大的讚賞。

謝謝!

+0

似乎是一個Hibernate的bug:https://hibernate.onjira.com/browse/HHH-1134 – overmeulen 2013-02-21 11:42:27

+0

問題解決了!由於我沒有10個聲望,我無法在8小時內回答我自己的問題。 明天我會發布解決方案。 – 2013-02-21 13:20:15

+0

您對每個外鍵使用了不同的列嗎?這是我想到的第一個想法,但這不僅僅是一種解決方案,而是一種黑客攻擊。 – overmeulen 2013-02-21 13:28:11

回答

1

謝謝,overmeulen,指向我相應的hibernate issue。它仍然是一個開放的Hibernate錯誤。

我申請的問題,意見中提到的解決方案之一:

@OrderBy("jahr ASC") 
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) 
@JoinColumn(name="BASE_ID", referencedColumnName="id") 
@Where(clause="DISC='PlanungA'") 
private List<PlanungA> planungA; 

通過插入@Where的語句由OR映射發出如下:

update 
    PLANUNG 
set 
    BASE_ID=null 
where 
    BASE_ID=? 
    and (
     DISC='PlanungA' 
    ) 

問題解決

謝謝!