Позволяет говорят, что у меня есть следующий 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, и другим проектам с помощью того же базового объекта не нравится слой персистентности.
Действительно ли это возможно? Действительно ли это - хорошая идея?
Спецификация 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, как показано выше
.Это возможно:
orm. xml
(соответствующий orm schema), и отобразить столбцы вашего POJO, даже не расширяя его. Это будет JPA-enabled в одной среде, и POJO в другойТем не менее, я не думаю, что это необходимо делать. Просто аннотируйте POJO и добавьте зависимость от времени компиляции в ваши проекты. Затем каждый проект сам решит, будет ли он использовать их как сущности JPA или нет.