使用JPA 1(hibernate-core版本3.3.0.SP1和hibernate-entitymanager版本3.4.0.GA): 我有一些類似於下面定義的實體,其中ChildOne和ChildTwo從父親實體。JPA繼承問題
@Entity
@Table(name = "TABLE_FATHER")
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(discriminatorType = DiscriminatorType.INTEGER, name = Father.C_ID_CTG)
public class Father {
@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = "sq")
@Column(name = "ID_PK", nullable = false)
@BusinessId
private Long id;
...
}
@Entity
@Table(name = "TABLE_CHILD_ONE")
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorValue(Categories.ID_CTG_ONE)
public class ChildOne extends Father {
...
}
@Entity
@Table(name = "TABLE_CHILD_TWO")
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorValue(Categories.ID_CTG_TWO)
public class ChildTwo extends Element {
...
}
比方說,我有一個實體具有父元素,另一個具有父元素的集合。在這兩種情況下,都應該去兒童實體。
@Entity
@Table(name = "TABLE_ONE")
public class OneTable {
@JoinColumn(name = "ID_PK", referencedColumnName = "ID_PK", nullable = false)
@ManyToOne(optional = false, fetch = FetchType.LAZY)
private Father element;
...
}
@Entity
@Table(name = "TABLE_ANOTHER")
public class Another {
@Fetch(FetchMode.JOIN)
@OneToMany(cascade = CascadeType.ALL, mappedBy = "id", fetch = FetchType.LAZY)
private Collection<Father> elementCollection;
...
}
我期待獲得永遠的子元素,但是當我得到getElement()
返回父元素 和,在另一方面,當我得到getElementCollection()
孩子元素來集合的元素。
顯然,@JoinColumn
是造成這種行爲的原因,與父表進行連接並忘記子元素。 集合按預期工作。
我怎麼能得到getElement()
電話的兒童元素?任何想法或workarround? 在此先感謝。
好點。讓我嘗試一些事情,我會讓你知道... – elcadro
只是關於你的答案的幾個筆記...據我所知,規範不需要實現使用鑑別器列來實現JOINED繼承,但是,假設是,如果@DiscriminatorColumn被指定,那麼它將被用於... 另一方面,儘管你的解決方案實際上工作,仍然有一些疑問。知道了懶惰返回代理,爲什麼ManyToOne返回代理到父(jpa.inheritance.issue.Parent _ $$ _ javassist_1)和OneToMany集合子代理(jpa.inheritance.issue.ChildOne _ $$ _ javassist_1)? – elcadro
實際應用中getElement()調用的確切返回類型不確定。如果在第一級或第二級緩存中找到該對象,將會鍵入「Child」。這就是爲什麼我在中間調用'em.clean()'來查明特定行爲的原因。這就是爲什麼在父子層次結構的情況下最好是類型不可知的。如果你真的需要一個正確的類型,你可以像我提議的那樣「取消代理」,或者更好地將FetchType改爲EAGER(因爲無論如何都是「unproxying」加載關係)。 – zbig