2013-02-21 127 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' 
    ) 

问题解决

谢谢!