Est-il possible de créer une entité JPA en étendant un POJO?

Disons que j’ai le POJO suivant:

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

Est-il maintenant possible d’étendre ce POJO en tant qu’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 séparé de l’entité JPA. Le POJO se trouve dans un projet différent et est souvent utilisé sans couche de persistance. Mon projet souhaite le conserver dans une firebase database sans le surcharger lors du mappage d’un object POJO vers une entité et inversement.

Je comprends que les entités JPA sont des POJO, mais pour l’utiliser, je devrais inclure une bibliothèque qui implémente javax.persistence et les autres projets utilisant le même object de base ne sont pas utiles pour une couche de persistance.

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

États de spécification JPA

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

L’annotation @ javax.persistence.MappedSuperclass vous permet de définir ce type de mappage

 @MappedSuperclass public class MyThing implements Serializable { private int myNumber; private Ssortingng myData; // getter's and setter's } 

Et

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

Comme dit par spécification JPA

L’annotation MappedSuperclass désigne une classe dont les informations de mappage sont appliquées aux entités qui en héritent .

Et

Une classe désignée par l’annotation MappedSuperclass peut être mappée de la même manière qu’une entité, sauf que les mappages ne s’appliqueront qu’à ses sous-classes car aucune table n’existe pour la superclasse mappée elle-même.

Si vous devez remplacer certaines propriétés définies par MyThing, utilisez @AtsortingbuteOverride (lorsque vous souhaitez remplacer une propriété unique) ou @AtsortingbuteOverrides (lorsque vous souhaitez remplacer plusieurs propriétés).

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

Et

 @Entity @Table(name="MY_OTHER_THING") @AtsortingbuteOverrides({ @AtsortingbuteOverride(name="myData1", column=@Column(name="MY_DATA_1")), @AtsortingbuteOverride(name="myData2", column=@Column(name="MY_DATA_2")) }) public class MyOtherThingEntity extends MyThing { } 

Si vous ne souhaitez pas modifier votre classe de base, vous pouvez utiliser xml pour le définir en tant que @MappedSuperClass.

Soyez conscient: par défaut, le fournisseur de persistance recherchera dans le répertoire META-INF un fichier nommé orm.xml

      

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

C’est possible:

  • vous pouvez le mapper avec XML – créez un orm.xml (conforme au schéma orm ) et orm.xml les colonnes de votre object POJO sans même le prolonger. Il sera compatible JPA dans un environnement et un POJO dans l’autre.
  • ne remplace que les méthodes getter et les annote – (je ne suis pas sûr que cela fonctionne)

Cela dit, je ne pense pas que ce soit nécessaire. Annotez simplement votre POJO et ajoutez la dépendance à la compilation à vos projets. Ensuite, chaque projet décidera s’il les utilisera comme entités JPA ou non.