2009-02-19 89 views
2

我有一個POJO即對象A,表表A休眠 - 聲明一個瞬態對象在POJO

TableA (int a1,int a2)的。

爲了填補這個表我運行一個查詢,返回(INT A1,INT A2,布爾B3)(並運行多個數據檢查)

B3是不是在表A有效,但我還是想用相同POJO兩個(這是一個非常大的POJO,這將是一個重大的重複代碼有一個只爲查詢的緣故)

我在POJO

@Transient 
Boolean getB3() {..} 
void setB3(Boolean b3) {..} 

而在宣佈查詢我宣佈我期望獲得b3值:

<return> ... 
<return-property name="b3" column="b3"/> 
... 
</return> 

但是Hibernate的只是忽略的參數,並從不使用「setB3()」 .. 當我刪除了@Transient,它的工作原理(然後失敗插入到表時,自然) - 使所有的名字都是正確

我該如何解決這個問題?

謝謝!

回答

3

好,不同的想法。我猜想,因爲你將屬性標記爲瞬態,hibernate將既不加載也不保存屬性。

一個解決方案可能是做兩個類。一個沒有b屬性。第二個使用mappedSuperclass註解從第一個擴展。

或者您可以嘗試將它與一些僅提供一些默認值(例如false)的formula進行映射。因此,對於'正常'的情況你休眠會使用公式,導致一些默認值,併爲您的特殊查詢使用該查詢中的任何邏輯。

0

你的Id註釋在哪裏?它是在吸氣劑還是吸氣劑上,還是在場上?

如果是在字段上,hibernate只會查看字段以查找其他註釋。

訪問類型

的存取類型屬性不再是@Entity,@EmbeddableSuperclass,@Embeddable可用。猜測給定實體的訪問類型來自@Id或@EmbeddedId註釋位置。如果實體在字段上有@Id,則訪問類型將爲字段,並且所有註釋將在字段上讀取。方法相同。 @MappedSuperclass(以前稱爲@EmbeddableSuperclass)和@Embeddable從他們的擁有實體繼承訪問類型。

用@Id爲給定實體註釋字段和方法是禁止的。

如果出於某種原因想要混合給定實體中的訪問類型或實體與其MappedSuperclass/Embeddable之間的訪問類型,可以使用特定於Hibernate的@AccessType註釋(請參閱參考文檔以獲取更多信息)。

這是http://www.hibernate.org/398.html

+0

我沒有真正明白你在說什麼,我很抱歉 – Yossale 2009-03-03 15:11:02

+0

我說的基本上與其他答案相同 – 2009-03-03 18:54:06

0

有你的屬性和方法的註釋混合?

例如,這不會工作:

@Entity 
public class A { 
    @Id 
    @GeneratedValue 
    private Long id; 

    @Column 
    private String b; 

    private String c; 

    public void setB(String b) { this.b = b; } 
    public String getB() { return b; } 

    @Transient // inconsistent with other annotations 
    public void setC(String c) { this.c = c; } 
    public String getC() { return c; } 
} 

鑑於此意願:

@Entity 
public class A { 
    @Id 
    @GeneratedValue 
    private Long id; 

    @Column 
    private String b; 

    @Transient // consistent with other annotations 
    private String c; 

    public void setB(String b) { this.b = b; } 
    public String getB() { return b; } 

    public void setC(String c) { this.c = c; } 
    public String getC() { return c; } 
} 
+0

不,一切都在它正確的地方,但它仍然不起作用:( – Yossale 2009-03-03 14:01:20

0

嘗試@Transient,get方法,而不是set方法。