Подтвердить что ты не робот

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

Возможно ли это? Это хорошая идея?

4b9b3361

Ответ 1

Спецификация спецификации JPA

Сущности могут расширять классы не-сущности, а также классы сущностей, а классы без сущностей могут расширять классы сущностей.

@javax.persistence.MappedSuperclass аннотации позволяет вам определить этот вид отображения

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

    // getter 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

Возможно:

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

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