簡體   English   中英

是否可以通過擴展POJO來構建JPA實體?

[英]Is it possible to build a JPA entity by extending a POJO?

可以說我有以下POJO:

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的庫,而使用相同基礎對象的其他項目對於持久層沒有用處。

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

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", column=@Column(name="MY_DATA"))
public class MyThingEntity extends MyThing {


}

@Entity
@Table(name="MY_OTHER_THING")
@AttributeOverrides({
    @AttributeOverride(name="myData1", column=@Column(name="MY_DATA_1")),
    @AttributeOverride(name="myData2", column=@Column(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,如上所示

有可能的:

  • 您可以使用XML映射它 - 創建一個orm.xml (符合orm架構 ),並映射POJO的列,甚至不擴展它。 它將在一個環境中啟用JPA,在另一個環境中啟用POJO
  • 只覆蓋getter方法並注釋它們 - (我不確定這是否可行)

也就是說,我認為沒有必要這樣做。 只需注釋您的POJO,並將編譯時依賴項添加到您的項目中。 然后每個項目將決定是否將它們用作JPA實體。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM