Можно ли построить объект JPA путем расширения POJO? - PullRequest
52 голосов
/ 25 марта 2010

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

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

Ответы [ 2 ]

70 голосов
/ 25 марта 2010

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

6 голосов
/ 25 марта 2010

Возможно:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...