java - que - ¿Es posible construir una entidad JPA extendiendo un POJO?
jpa relaciones (2)
Es posible:
- puedes
orm.xml
con XML:orm.xml
unorm.xml
(conforme al esquema de orm ) yorm.xml
las columnas de tu POJO, sin siquiera extenderlo. Será habilitado para JPA en un entorno, y un POJO en el otro - anula solo los métodos getter y anótalos - (no estoy seguro si esto funcionará)
Dicho eso, no creo que sea necesario hacer esto. Simplemente haga una anotación en su POJO y agregue la dependencia en tiempo de compilación a sus proyectos. Luego, cada proyecto decidirá si los usará como entidades JPA o no.
Digamos que tengo el siguiente POJO:
public class MyThing {
private int myNumber;
private String myData;
//assume getter/setter methods
}
¿Ahora es posible extender este POJO como una entidad JPA?
@Entity
@Table(name = "my_thing")
public class MyThingEntity extends MyThing implements Serializable {
@Column(name = "my_number")
//?????????
@Column(name = "my_data")
//????????
}
Quiero mantener el POJO separado de la entidad JPA. El POJO vive en un proyecto diferente y a menudo se utiliza sin una capa de persistencia, mi proyecto quiere persistir en una base de datos y hacerlo sin la sobrecarga de la asignación de un POJO a una entidad y viceversa.
Entiendo que las entidades JPA son POJO, pero para usarlo tendría que incluir una biblioteca que implemente javax.persistence y los otros proyectos que usen el mismo objeto base no tengan uso para una capa de persistencia.
es posible? ¿Es esta una buena idea?
Estados de especificación JPA
Las entidades pueden extender clases no-entidades así como también clases de entidades , y las clases que no son entidades pueden extender clases de entidades.
@ javax.persistence.MappedSuperclass anotación le permite definir este tipo de mapeo
@MappedSuperclass
public class MyThing implements Serializable {
private int myNumber;
private String myData;
// getter''s and setter''s
}
Y
@Entity
@Table(name="MY_THING")
public class MyThingEntity extends MyThing {
}
Como dice la especificación JPA
La anotación MappedSuperclass designa una clase cuya información de asignación se aplica a las entidades que heredan de ella .
Y
Una clase designada con la anotación MappedSuperclass se puede correlacionar de la misma manera que una entidad, excepto que las asignaciones se aplicarán solo a sus subclases, ya que no existe una tabla para la propia superclase mapeada.
Si necesita anular alguna propiedad definida por MyThing, use @AttributeOverride (cuando desee anular una sola propiedad) o @AttributeOverrides (cuando desee anular más de una propiedad)
@Entity
@Table(name="MY_THING")
@AttributeOverride(name="myData", column=@Column(name="MY_DATA"))
public class MyThingEntity extends MyThing {
}
Y
@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 no desea cambiar su clase base, puede usar xml para definirla como @MappedSuperClass
Tenga en cuenta: de forma predeterminada, el proveedor de persistencia buscará en el directorio META-INF un archivo llamado 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>
Nada más Si desea anular una propiedad, use @AttributeOverride como se muestra arriba