【问题标题】:How to map entity property to entities of inheritance SINGLE_TABLE in hibernate?如何在休眠中将实体属性映射到继承 SINGLE_TABLE 的实体?
【发布时间】:2013-05-29 11:46:53
【问题描述】:

我有继承类型为 SINGLE_TABLE 的实体层次结构:

@Entity  
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)  
@DiscriminatorValue("junioruser")  
@DiscriminatorColumn(name = "dtype", discriminatorType = DiscriminatorType.STRING)  
.........  
public class JuniorUser  { 

问题是如何将此 JuniorUser 实体及其所有子类映射为 Answer 实体中的属性:

@Entity  
public class Answer  {  
private JuniorUser user;  
.......................... 

如果不可能,那么如何使用 hibernate 4 映射到 JuniorUser 或 JuniorUser 本身的 Answer 实体正确子类中的“用户”属性?

更新: 我这样做是为了检索答案和关联用户:

Answer answer = sessionFactory.getCurrentSession().get(entityClass, id);

询问相关用户的规范名称

answer.getUser().getClass().getCanonicalName();

com.javahelp.domain.impl.JuniorUser_$$_javassist_3
接下来询问属性 dtype 的值,它给出了“junioruser”。 最后一件事是这个用户的所有其他属性都是空的,包括 user_id 属性。
我自己看到,对于检索到的答案,我有相关用户,其 dtype 为 'expertuser'

谢谢!

【问题讨论】:

  • 使用 ManyToOne(假设用户有多个答案)。有什么问题?为什么您认为继承会改变关联的映射方式?
  • 非常抱歉!它确实检索了 ExpertUser!问题是我为用户指定了 FetchType.LAZY 并试图通过反射获取用户值。用户属性尚未被休眠初始化!

标签: java hibernate single-table-inheritance relationships


【解决方案1】:

这里的主要问题是对获取类型的误解。

FetchType.EAGER 表示在一次选择中加载父项时从数据库中加载相关实体属性。创建相关实体的新实例并将从数据库中获取的所有值分配给其属性。相关实体本身也分配给父实体的属性。

FetchType.LAZY 表示当从数据库加载父级时,创建此类相关实体的代理并将代理分配给父级实体属性。要获取延迟加载的相关实体的任何值,需要调用其代理的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-31
    • 2019-12-03
    • 2020-12-18
    • 2022-01-02
    • 2011-07-25
    • 1970-01-01
    • 2015-08-02
    相关资源
    最近更新 更多