javajpa继承问题
使用JPA1(hibernate core版本3.3.0.SP1和hibernate entitymanager版本3.4.0.GA): 我有一些类似于下面定义的实体,其中ChildOne和ChildTwo扩展自父实体
@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()
调用获取children元素?有什么想法或想法吗?
提前谢谢
# 1 楼答案
这个问题不是由
@JoinColumn
引起的。 原因是延迟加载。 我设法用更简单的例子指出了你的问题。 请原谅我把传统从父亲变成了父母在下面的示例中,未初始化的元素是
jpa.inheritance.issue.Parent_$$_javassist_1
类型。它是一个Hibernate代理——动态创建的父类的子类。 您可以通过调用Hibernate专有APIgetHibernateLazyInitializer().getImplementation()
来“取消固定”它elementCollection
的集合也已初始化。集合的类型为org.hibernate.collection.PersistentBag
,在第一次访问时使用正确的数据初始化。 集合一次全部初始化。 请查看与您的Hibernate(3.3.0.SP1/3.4.0.GA)完全相同的版本成功通过绿色测试的测试您不需要
@DiscriminatorColumn
或@DiscriminatorValue
,因为这些注释是InheritanceType.SINGLE_TABLE
确定类型的唯一手段。 有了InheritanceType.JOINED
,Hibernate可以通过检查(父表和子表)中是否有具有相同Id的记录来确定多态类型。 您可以打开hibernate日志来查看用于确定类型的查询的外观。它的工作原理如下: