Действительно ли возможно создать объект JPA путем расширения 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 являются POJOs, но для использования его, я должен был бы включать библиотеку, которая реализует javax.persistence, и другим проектам с помощью того же базового объекта не нравится слой персистентности.

Действительно ли это возможно? Действительно ли это - хорошая идея?

54
задан Freiheit 25 March 2010 в 04:31
поделиться

2 ответа

Спецификация 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, как показано выше

.
71
ответ дан 7 November 2019 в 08:05
поделиться

Это возможно:

  • вы можете отобразить его с помощью XML - сделайте orm. xml (соответствующий orm schema), и отобразить столбцы вашего POJO, даже не расширяя его. Это будет JPA-enabled в одной среде, и POJO в другой
  • переопределите только методы getter и аннотируйте их - (я не уверен, что это будет работать)

Тем не менее, я не думаю, что это необходимо делать. Просто аннотируйте POJO и добавьте зависимость от времени компиляции в ваши проекты. Затем каждый проект сам решит, будет ли он использовать их как сущности JPA или нет.

6
ответ дан 7 November 2019 в 08:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: