2010-03-25 64 views
49

可以說我有以下POJO:是否可以通過擴展POJO來構建JPA實體?

public class MyThing { 
private int myNumber; 
private String myData; 
//assume getter/setter methods 
} 

是現在可能這個POJO擴展爲JPA實體?

@Entity 
@Table(name = "my_thing") 
public class MyThingEntity extends MyThing implements Serializable { 
@Column(name = "my_number") 
//????????? 
@Column(name = "my_data") 
//???????? 
} 

我想保持POJO與JPA實體分開。 POJO生活在一個不同的項目中,並且通常在沒有持久層的情況下使用,我的項目希望將其保存在數據庫中,並且不需要從POJO映射到實體並返回的開銷。

我知道JPA實體是POJO,但爲了使用它,我必須包含一個實現了javax.persistence的庫,而使用相同基礎對象的其他項目對持久層沒有用處。

這可能嗎?這是一個好主意嗎?

回答

63

JPA規範規定

實體可延伸的非實體類以及實體類,和非實體類可以延伸實體類。

@ javax.persistence.MappedSuperclass註解允許你定義這種映射的

@MappedSuperclass 
public class MyThing implements Serializable { 
    private int myNumber; 
    private String myData; 

    // getter's and setter's 
} 

而且

@Entity 
@Table(name="MY_THING") 
public class MyThingEntity extends MyThing { 


} 

正如JPA規範

的MappedSuperclass註釋說指定類別其映射信息應用於從其繼承的實體

而且

與MappedSuperclass註釋指定一個類可以以同樣的方式映射,只是因爲沒有表存在映射超映射只適用於它的子類實體本身。

如果需要覆蓋由MyThing定義的一些屬性,請使用@AttributeOverride(當你要覆蓋一個屬性)或@AttributeOverrides(當你想要覆蓋不止一個屬性)

@Entity 
@Table(name="MY_THING") 
@AttributeOverride(name="myData", [email protected](name="MY_DATA")) 
public class MyThingEntity extends MyThing { 


} 

而且

@Entity 
@Table(name="MY_OTHER_THING") 
@AttributeOverrides({ 
    @AttributeOverride(name="myData1", [email protected](name="MY_DATA_1")), 
    @AttributeOverride(name="myData2", [email protected](name="MY_DATA_2")) 
}) 
public class MyOtherThingEntity extends MyThing { 

} 

如果你不想改變你的基類,你可以使用XML來定義它作爲@MappedSuperclass

注意:默認情況下,持久性提供會看在META-INF目錄下名爲orm.xml中

<?xml version="1.0" encoding="UTF-8"?> 

<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_1_0.xsd" version="1.0"> 
    <mapped-superclass class="MyThing"> 

    </mapped-superclass> 
</entity-mappings> 

閒來無事的文件。如果你想要覆蓋的屬性,使用@AttributeOverride如上圖所示

+2

我懷疑的想法是不改變MyThing類 – 2010-03-25 15:54:32

+1

馬克西姆是正確的,我不想碰基地POJO的。它可能仍然有效,'@MappedSuperclass MyThingMapper擴展MyThing .... MyThingEntity擴展MyThingWrapper' – Freiheit 2010-03-25 17:34:37

+0

@Freiheit已添加到原始答覆 – 2010-03-25 18:04:57

6

這是可能的:

  • 你可以用XML映射它 - 讓一個orm.xml(符合orm schema),並繪製你的POJO的列,甚至沒有擴展它。這將是JPA啓用在一個環境中,而在另一個
  • 覆蓋只是getter方法一個POJO,並加以註釋 - (我不知道這是否會工作)

這麼說,我不要認爲有必要這樣做。只需註釋POJO,並將編譯時依賴項添加到項目中。然後每個項目將決定是否將它們用作JPA實體。

+0

注意,你必須找到一種方法,當POJO被改變,所以你可以改變你的映射文件的通知。 – 2010-03-25 14:44:46

+0

現在假設運行具有POJO的項目的團隊在任何情況下都不允許我提交帶有JPA批註和javax.persistence導入的修補程序。 是否有這樣的事,作爲一個「虛擬」 javax.persistence庫,所以進口的作品,但世界上沒有需要拖動的EclipseLink JAR文件,如果周圍的持久性是不想要? – Freiheit 2010-03-25 14:50:38

+1

即使包含它們的jar不存在,註釋本身也不會導致運行時問題。編譯時仍然需要它。我不知道還有什麼地方,這是可以的,但Maven有一個javax.persistence的持久性,API-1.0.jar在庫(http://mvnrepository.com/artifact/javax.persistence/persistence-api/1.0) 。 – ColinD 2010-03-25 15:55:41

相關問題