0

これがシナリオです:

  • Hibernateでマップされた2つのクラス「Foo」と「EnhancedFoo」があります

  • 両方のクラスが同じテーブル「foo」にマップされます

  • EnhancedFooはFooを拡張します

  • Foo.hbm.xmlには、次のような名前付きクエリ「findactivefoos」が含まれています。

     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」がないため、これは正しいですが、なぜ休止状態で「Foo」が「EnhancedFoo」に置き換えられるのでしょうか。


これは私が試したことです:

次のように、マッピングファイルに「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>
4

1 に答える 1

1

2つの問題があります。

1)スーパークラスとサブクラスの両方をマップするべきではありません。問題は、サブクラスインスタンスもスーパークラスのインスタンスであり、この例では、EnhancedFooインスタンスもFooのインスタンスであるということです。これにより、セッションキャッシュを調べるときに休止状態が混乱します。(問題はありませんでしたが、主キー値を条件としてスーパークラスインスタンスをロードすると、uniqueResult()が失敗しました。これは、キャッシュ内でスーパークラスのインスタンスとサブクラス。)置き換えられたFooも同様の効果を引き起こす可能性があります。

2つのマッピングを続行する場合は、次のようにすることができます

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

マッピングファイルをそのままにします。

(もう1つの可能性は、1つのクラスのみをマップし、Javaの違いを処理することです。)

2)挿入の問題の場合:プロジェクトで「j」ではなく「y」の
エラーメッセージが表示されました。Unknown entity: myproyect.data.entity.Fooどこかにタイプミスがありますか?

于 2012-05-24T08:05:26.967 に答える