strategy secuencias generationtype generatedvalue java hibernate jpa annotations

java - secuencias - jpa sequence generator



¿Cómo anulo la estrategia GenerationType usando anotaciones de Hibernate/JPA? (4)

En el código anterior, parece que estás mezclando anotaciones en campos (superclase) y métodos (subclase). La documentación de referencia de Hibernate recomienda evitar esto, y sospecho que podría estar causando el problema. En mi experiencia con Hibernate, es más seguro y más flexible anotar métodos getter / setter en lugar de campos de todos modos, por lo que sugiero que sigas ese diseño si puedes.

Como solución a su problema, le recomiendo eliminar el campo de identificación de su superclase base. En su lugar, mueva ese campo a las subclases y cree métodos abstractos getId () y setId () en su clase Base. Luego anule / implemente los métodos getId () y setId () en sus subclases y anote los getters con la estrategia de generación deseada.

Espero que esto ayude.

Estoy considerando usar Anotaciones para definir mis asignaciones de Hibernate, pero me encontré con un problema: quiero usar una clase de entidad base para definir campos comunes (incluido el campo ID) pero quiero que diferentes tablas tengan diferentes estrategias de generación de ID:

@MappedSuperclass public abstract class Base implements Serializable { @Id @Column(name="ID", nullable = false) private Integer id; public Integer getId(){return id;} public void setId(Integer id){this.id = id;} ... } @Entity @Table(name="TABLE_A") public class TableA extends Base { // Table_A wants to set an application-defined value for ID ... } @Entity @Table(name="TABLE_B") public class TableB extends Base { // How do I specify @GeneratedValue(strategy = AUTO) for ID here? ... }

Hay alguna manera de hacer esto? Intenté incluir lo siguiente en TableB pero hibernate se opuso a que yo tenga la misma columna dos veces y me parece incorrecto:

@Override // So that we can set Generated strategy @Id @GeneratedValue(strategy = AUTO) public Integer getId() { return super.getId(); }


En el método en el niño, no agregue la segunda etiqueta @Id.

@Override // So that we can set Generated strategy @GeneratedValue(strategy = AUTO) public Integer getId() { return super.getId(); }


Si coloca sus anotaciones en el captador en lugar del campo, cuando anula el método en la subclase, se usarán las anotaciones colocadas allí en lugar de las de la superclase.


Mi resolución:

Refactorizar la clase Base en:

@MappedSuperclass abstract class SuperBase<K> { public abstract K getId(); } @MappedSuperclass class Base<K> extends SuperBase<K> { @Id @GeneratedValue(AUTO) public K getId() { ... } }

Luego, puede extenderse desde Base para la mayoría de las clases de entidad, y si necesita anular el valor @GeneratedValue , simplemente SuperBase desde SuperBase y SuperBase .