在命名查询中替换实体名称

时间:2012-05-23 17:18:14

标签: hibernate named-query

这是情景:

  • 我有2个用hibernate映射的类:“Foo”和“EnhancedFoo”
  • 两个clases都映射到同一个表“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用“EnhancedFoo”重新启动“Foo”?


这就是我尝试过的:

尝试在映射文件上添加“enity-name”属性,如下所示:

<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>

1 个答案:

答案 0 :(得分:1)

我看到两个问题:

1)你永远都不应该映射超类和子类。问题是,子类实例也是超类的实例,在您的示例中,EnhancedFoo实例也是Foo的实例。这会在查看会话缓存时混淆休眠。 (我没有你的问题,但我有效果,当我用主键值加载超类实例作为条件然后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'。你在哪里有拼写错误吗?