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

Disons que j'ai le POJO suivant:

public class MyThing {
 private int myNumber;
 private String 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 vit dans un projet différent et est souvent utilisé sans couche de persistance, mon projet veut le conserver dans une base de données et le faire sans la surcharge de mappage d'un POJO à une entité et retour.

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

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

50
demandé sur Freiheit 2010-03-25 17:31:18

2 réponses

États de spécification JPA

Entités peut 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.persistance.L'annotation MappedSuperclass vous permet de définir ce type de mappage

@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 indiqué par la spécification JPA

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

Et

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

Si vous devez remplacer une propriété définie par MyThing, utilisez @AttributeOverride (lorsque vous voulez remplacer une seule propriété) ou @AttributeOverrides (lorsque vous voulez remplacer plusieurs propriétés propriété)

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


}

Et

@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 {

}

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

Attention: par défaut, le fournisseur de persistance recherchera dans le répertoire META-INF 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 voulez remplacer une propriété, utilisez @AttributeOverride comme indiqué ci-dessus

68
répondu Arthur Ronald 2016-12-14 11:42:27

C'est possible:

  • Vous pouvez le mapper avec XML-make an orm.xml (conforme au schéma orm), et mapper les colonnes de votre POJO, sans même l'étendre. Il sera activé par JPA dans un environnement, et un POJO dans l'autre
  • remplacez simplement les méthodes getter et annotez-les - (Je ne suis pas sûr si cela fonctionnera)

Cela dit, Je ne pense pas qu'il soit nécessaire de le faire. Annotez simplement votre POJO et ajoutez la dépendance à la compilation à vos projets. Ensuite, chaque projet décidera s'il les utilisera ou non en tant qu'entités JPA.

6
répondu Bozho 2010-03-25 14:42:46