【问题标题】:Entity name getting replaced on named query实体名称在命名查询中被替换
【发布时间】:2012-05-23 17:18:14
【问题描述】:

这是场景:

  • 我有 2 个使用 hibernate 映射的类:“Foo”和“EnhancedFoo”

  • 两个类都映射到同一个表“foo”

  • EnhancedFoo 扩展了 Foo

  • Foo.hbm.xml 包含一个命名查询“find active foos”,如下所示:

     from Foo foo where foo.active = true
    

现在,如果我尝试加载配置,我会收到以下异常:

could not resolve property: active of: EnhancedFoo [
    from EnhancedFoo foo where foo.active = true
]

这是正确的,因为在 EnhancedFoo.hbm.xml 中没有映射属性“active”,但是为什么 hibernate 将“Foo”替换为“EnhancedFoo”?


这是我尝试过的:

尝试在映射文件上添加“实体名称”属性,如下所示:

<class name="myproject.data.entity.Foo" table="foo" entity-name="Foo">
.......
<class name="myproject.data.entity.EnhancedFoo" table="foo" entity-name="EnhancedFoo">

然后配置加载正常,但是每当我尝试插入 Foo 时,我都会得到:

org.hibernate.MappingException: Unknown entity: myproject.data.entity.Foo

这些是代码的相关部分:

//Foo.java
public class Foo 
{
  private long id;
  private boolean active;

  // getters and setters
}


//EnhancedFoo.java
public class EnhancedFoo extends Foo
{
  private String extraProperty

  // getter and setter
}

//Foo.hbm.xml
//.....
<class name="myproject.data.entity.Foo" table="foo" entity-name="Foo">
  <id column="id" name="id">
    <generator class="assigned"/>
  </id>

  <property name="active" column="active" />
</class>

<query name="find_active_foos">
  <![CDATA[
    from Foo foo where foo.active = true
  ]]>
</query>


//EnhancedFoo.hbm.xml
//.....
<class name="myproject.data.entity.EnhancedFoo" table="foo" entity-name="EnhancedFoo">
  <id column="id" name="id">
    <generator class="assigned"/>
  </id>
</class>

【问题讨论】:

  • 在同一张表上映射两个实体没有多大意义。你为什么要这样做?
  • 抱歉耽搁了,实际上 Foo 它是一个巨大的单片机类,团队不再接触什么,所以我们尝试映射第二个类,只是为了坚持因为实例化 Foo 在其构造函数中做了很多幕后工作 =(

标签: hibernate named-query


【解决方案1】:

我看到两个问题:

1) 你永远不应该同时映射超类和子类。问题是,子类实例也是超类的实例,在您的示例中,EnhancedFoo 实例也是 Foo 的实例。在查看会话缓存时,这会混淆 hibernate。 (我没有遇到你的问题,但是我有效果,当我以主键值作为条件加载超类实例时,uniqueResult() 失败,因为它在缓存中找到了超类的一个实例和一个子类。)您替换的 Foo 也可能导致类似的效果。

如果你想继续这两个映射,你可以这样做

//AbstractFoo.java
public abstract class AbstractFoo 
{
  private long id;
  private boolean active;
  // getters and setters
}

//Foo.java
public class Foo extends AbstractFoo
{  // empty body
}

//EnhancedFoo.java
public class EnhancedFoo extends AbstractFoo
{
  private String extraProperty
  // getter and setter
}

然后让映射文件保持原样。

(另一种可能性是只映射一个类并处理 Java 中的差异。)

2) 对于您的插入问题:
您在项目中收到错误消息Unknown entity: myproyect.data.entity.Foo,其中“y”而不是“j”。你那里有错字吗?

【讨论】:

  • 对不起,我发布了一个错字的答案,我们最终应用了您的解决方案,所以谢谢!
猜你喜欢
  • 2020-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-21
  • 2018-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多