2012-05-23 60 views
0

這remplaced是情景:實體名稱越來越命名查詢

  • 我有2類與Hibernate映射:「富」和「EnhancedFoo」
  • 兩個clases被映射到同一個表「富」
  • EnhancedFoo延伸富
  • Foo.hbm.xml包含一個名爲查詢 「查找活動的Foo」 至極是這樣的:

    from Foo foo where foo.active = true 
    
現在

,如果我嘗試加載配置我得到這個異常:

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

至極是一種正確的,因爲在EnhancedFoo.hbm.xml沒有一個對應的屬性「活躍」,但隨後爲什麼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 

這些代碼的相關部分:在advace

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

對於這個延遲感到抱歉,實際上Foo是一個巨大的單片式的do-everything-class,而團隊不再接觸什麼,所以我們試圖映射第二個類,並且僅僅爲了持久化,因爲實例化Foo做了很多後面的事情場景在其構造函數中工作=( – Harima555

回答

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」在項目中。你在哪裏有錯別字?

+0

對不起,我發佈錯誤的答案,我們結束了應用您的解決方案,謝謝! – Harima555