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(只是为了尝试)。它没有解决这种行为。
  • 搜索了世界...

非常感谢任何帮助,指出我类似的问题等。

谢谢!

4

1 回答 1

1

谢谢,overmeulen,为我指出了相应的休眠问题。它仍然是一个开放的 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'
    ) 

问题解决了

谢谢!

于 2013-02-22T11:47:48.527 回答