type how enum column annotation java hibernate jpa

java - how - Entidad JPA sin identificación



how to map an enum to a database column (5)

Tengo una base de datos con la siguiente estructura:

CREATE TABLE entity ( id SERIAL, name VARCHAR(255), PRIMARY KEY (id) ); CREATE TABLE entity_property ( entity_id SERIAL, name VARCHAR(255), value TEXT );

Cuando intento crear una clase EntityProperty

@Entity @Table(name="entity_property") public class EntityProperty { private String name; private String value; @Column(name="name") public String getName() { return name; } public void setName(String name) { this.name = name; } @Column(name="value", nullable=true, length=255) public String getValue() { return value; } public void setValue(String value) { this.value = value; } }

Obtengo la siguiente excepción:

org.hibernate.AnnotationException: No identifier specified for entity: package.EntityProperty

Sé que las entidades JPA deben tener una clave principal, pero no puedo cambiar el esquema de la base de datos por razones que escapan a mi control. ¿Es posible crear entidades JPA (Hibernate) que funcionen con un esquema de base de datos como este?


Sé que las entidades JPA deben tener clave principal, pero no puedo cambiar la estructura de la base de datos por razones que escapan a mi control.

Más precisamente, una entidad JPA debe tener un Id definido. Pero un Id JPA no necesariamente tiene que asignarse en la clave primaria de la tabla (y JPA de alguna manera puede tratar con una tabla sin una clave primaria o una restricción única).

¿Es posible crear entidades JPA (Hibernate) que funcionarán con una estructura de base de datos como esta?

Si tiene una columna o un conjunto de columnas en la tabla que hace un valor único, puede usar este conjunto único de columnas como su Id en JPA.

Si su tabla no tiene columnas únicas, puede usar todas las columnas como Id .

Y si su tabla tiene alguna identificación pero su entidad no lo tiene, Embeddable en Embeddable .


Consulte el libro Persistencia de Java : identidad y secuenciación

La parte relevante para su pregunta es la sección Sin clave principal :

A veces su objeto o tabla no tiene clave principal. La mejor solución en este caso es normalmente agregar un ID generado al objeto y la tabla. Si no tiene esta opción, a veces hay una columna o conjunto de columnas en la tabla que conforman un valor único. Puede usar este conjunto único de columnas como su id en JPA. El Id JPA no siempre tiene que coincidir con la restricción de la clave primaria de la tabla de la base de datos, ni se requiere una clave primaria o una restricción única.

Si su tabla realmente no tiene columnas exclusivas, utilice todas las columnas como id. Normalmente, cuando esto ocurre, los datos son de solo lectura, por lo que incluso si la tabla permite filas duplicadas con los mismos valores, los objetos serán los mismos de todos modos, por lo que no importa que JPA piense que son el mismo objeto. El problema con permitir actualizaciones y eliminaciones es que no hay forma de identificar de manera única la fila del objeto, por lo que todas las filas coincidentes se actualizarán o eliminarán.

Si su objeto no tiene una identificación, pero su ''tabla lo hace, está bien. Haga que el objeto sea un objeto incrustable, los objetos incrustados no tienen identificadores. Necesitará una Entity que contenga este Embeddable para persistir y consultarlo.


Si hay un mapeo de uno a uno entre la entidad y la propiedad de la entidad, puede usar entity_id como el identificador.


Supongo que puede usar @CollectionOfElements (para hibernate / jpa 1) / @ElementCollection (jpa 2) para asignar una colección de "propiedades de entidad" a una List en entity .

Puede crear el tipo EntityProperty y anotarlo con @Embeddable


Supongo que su entity_property tiene una clave compuesta (entity_id, name) donde entity_id es una clave foránea para la entity . Si es así, puede asignarlo de la siguiente manera:

@Embeddable public class EntityPropertyPK { @Column(name = "name") private String name; @ManyToOne @JoinColumn(name = "entity_id") private Entity entity; ... } @Entity @Table(name="entity_property") public class EntityProperty { @EmbeddedId private EntityPropertyPK id; @Column(name = "value") private String value; ... }