54 votes

Est-il possible de construire une entité JPA par l'extension d'un POJO?

Disons que j'ai la suite de POJO:

public class MyThing {
 private int myNumber;
 private String myData;
//assume getter/setter methods
}

Il est maintenant possible d'étendre cette POJO comme une entité JPA?

@Entity
@Table(name = "my_thing")
public class MyThingEntity extends MyThing implements Serializable {
 @Column(name = "my_number")
 //?????????
 @Column(name = "my_data")
 //????????
}

Je veux garder le POJO distincte de l'entité JPA. Le POJO vit dans un projet différent et est souvent utilisé sans une couche de persistance, mon projet veut persister dans une base de données et de le faire sans l'aide de la cartographie à partir d'un POJO à une entité et à l'arrière.

Je comprends que des entités JPA sont des Pojo, mais pour les utiliser il me faudrait inclure une bibliothèque qui implémente javax.la persistance et les autres projets à l'aide de la même objet de base n'ont aucune utilité pour une couche de persistance.

Est-ce possible? Est-ce une bonne idée?

71voto

Arthur Ronald Points 19001

Spécification JPA unis

Les entités peuvent s'étendre non-classes d'entité ainsi que les classes d'entité, et non les classes d'entité peut étendre les classes d'entité.

@javax.la persistance.MappedSuperclass annotation vous permet de définir ce type de cartographie

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

    // getter's and setter's

}

Et

@Entity
@Table(name="MY_THING")
public class MyThingEntity extends MyThing {


}

Comme l'a dit par la spécification JPA

Le MappedSuperclass annotation désigne une classe dont les informations de mappage est appliquée aux entités qui héritent de celui-ci.

Et

Une classe désignée par la MappedSuperclass annotation peut être défini de la même manière comme une entité, sauf que les mappages ne s'appliquent qu'à ses sous-classes depuis aucune table n'existe pour le mappé super-classe elle-même.

Si vous avez besoin de remplacer certains biens définis par MyThing, utilisez @AttibuteOverride (lorsque vous voulez remplacer une seule propriété) ou @AttibuteOverrides (lorsque vous voulez remplacer plus d'une propriété)

@Entity
@Table(name="MY_THING")
@AttributeOverride(name="myData", column=@Column(name="MY_DATA"))
public class MyThingEntity extends MyThing {


}

Si vous ne voulez pas changer votre classe de base, vous pouvez utiliser le format xml pour le définir comme @MappedSuperClass

Attention: par défaut, le fournisseur de persistance dans le répertoire META-INF pour un fichier nommé 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>

Rien d'autre. Si vous souhaitez remplacer une propriété, utilisez @AttributeOverride comme indiqué ci-dessus

6voto

Bozho Points 273663

Il est possible:

  • vous pouvez mapper avec XML - faire un orm.xml (conforme à l' orm schéma), et de mapper les colonnes de votre POJO, sans même l'étendre. Il sera JPA-activé dans un environnement et d'un POJO dans l'autre
  • remplacer juste les méthodes de lecture et de les annoter - (je ne suis pas sûr si cela fonctionne)

Cela dit, je ne pense pas qu'il est nécessaire pour ce faire. Seulement d'annoter vos POJO, et ajouter à la compilation de la dépendance du temps pour vos projets. Ensuite, chaque projet doit décider si elle va les utiliser comme des entités JPA ou pas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X