2012-07-31 206 views
0

我將實現一個實體類,喜歡的東西:JPA映射註釋對象類型

@Entity 
public class XXXEntity { 
    @Id 
    private Long id; 

    private Object entity; 
} 

但我不知道如何對象類型字段映射?

其實,在我的項目的對象類型包含其他幾個實體,如A,B,C(全部A,B和C實現Serilizable接口)

我想註釋它作爲@Lob,但我不確定這是否正確?因爲Object沒有實現Serilizable接口。

有關於此的任何想法?謝謝。

+0

當你說「對象類型包含其他幾個實體」時,你是指JPA實體還是其他一些對象?如果是其他JPA實體,爲什麼要將它們保存到LOB而不是自己的表中? – 2012-07-31 07:54:16

+0

請仔細閱讀問題,然後詢問。 – ttt 2012-07-31 12:56:12

回答

0

不,用@Lob註釋它是不正確的。您不能直接將任意對象註釋爲持久屬性。 JPA提供者無法知道如何堅持它。

根據JPA 2.0規範持久屬性必須是下列之一:

Java基本類型; java.lang.String中;其他Java可序列化類型 (包括原始類型的包裝, java.math.BigInteger,java.math.BigDecimal,java.util.Date,java.util.Calendar [5], java.sql.Date,java。 sql.Time,java.sql.Timestamp,byte [],Byte [], char [],Character []和實現可串行化接口的用戶定義類型);枚舉;實體類型;實體 類型的集合;可嵌入類;基本和可嵌入類型的集合。

您應該重新設計模型,以便不需要基本上保留無類型的數據。

+0

是正確的還是不正確的?謝謝 – ttt 2012-07-31 12:57:28

+0

我想我可以使用Serializable而不是Object,它應該可以工作... – ttt 2012-07-31 14:23:31

0

您不能將對象字段註釋爲@Lob。根據規範:「一個Lob可能是一個二進制或字符類型。」

+0

所以我可以知道什麼是最好的解決方案嗎?謝謝 – ttt 2012-07-31 13:07:10

+0

你有2個選擇:使用[JPA實體繼承](http://docs.oracle.com/javaee/6/tutorial/doc/bnbqn.html)或de/serialize實體對象作爲二進制數組:@Lob byte [ ] 實體; – Arvik 2012-07-31 14:08:04

+0

我想我可以使用Serializable而不是Object,它應該工作... – ttt 2012-07-31 14:23:55

0

您應該決定A,B和C是實體還是狀態字段值。如果它們是實體並且它們可以被引用,通過它們的屬性來查詢,那麼創建一個通用的超類。

如果它們只是一個對象,那麼使用Lob和實現Serializable就足夠了。如果JPA提供者要求你用其他東西替換Object,就像你所說的那樣,你可以使用Serializable接口,如果這樣做不起作用,那麼就是一個實現Serializable的普通超類。

0

在我看來,你想用它作爲「ValueObject」(如你提到的可序列化)而不是「實體」。

如果將該字段視爲ValueObject,那很好。使用Lob應該沒問題(並且您總是可以通過手動序列化來找到解決方法)。

但是,如果您想將它們視爲「實體」,將其聲明爲「對象」的參考永遠是合理的。其中最明顯的一個參數是Object不是一個實體,因爲它不包含任何實體標識。