tabla secuencias mapear llave idclass generationtype foranea entidades crear con compuesta column java hibernate jpa

java - secuencias - ¿Puede @TableGenerator guardar la última identificación utilizada en la tabla en lugar de la siguiente disponible?



pk compuesta jpa (1)

Necesito conectarme con un proveedor db e insertar datos del cliente. La tabla de secuencias utilizada para generar nuevos ID de cliente almacena la última ID utilizada (no la siguiente disponible). No pude encontrar nada en los documentos jpa o hibernate que indique una forma de decirle a hibernate que trate el id. En la tabla seq como último usado en lugar de next disponible (cuando se usa @TableGenerator).

¿Debo escribir un generador personalizado que se comporte esencialmente igual que @TableGenerator con la única diferencia de la forma en que se trata el valor en la tabla de secuencia?

Mi entidad de Cliente se define de la siguiente manera:

@Entity public class Customer { @Id @TableGenerator(name = "cust_gen", table = "SEQUENCE", pkColumnName = "target", pkColumnValue = "customer", valueColumnName = "id", allocationSize = 1) @GeneratedValue(strategy = GenerationType.TABLE, generator = "pat_gen") public long getCustomer_id() { return customer_id; } public void setCustomer_id(Long id) { this.customer_id = id; } ... }

¡Gracias!


Yo tuve el mismo problema. Se corrigió de esta manera: utilice Hibernate org.hibernate.annotations.GenericGenerator en lugar de persistencia TableGenerator de esta manera:

import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import org.hibernate.annotations.GenericGenerator; @Entity @Table(name = "name") public class Name implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.TABLE, generator = "names") @GenericGenerator(name = "names", strategy = "com.ourpackage.SybaseTableGenerator", parameters = { @Parameter(name = "table_name", value = "new_key_numbers"), @Parameter(name = "value_column_name", value = "key_number"), @Parameter(name = "segment_column_name", value = "name"), @Parameter(name = "segment_value", value = "names_key") }) @Column(name = "names_id") private Long id;

Y crea tu propio generador (utilicé el nombre com.ourpackage.SybaseTableGenerator):

import java.io.Serializable; import org.hibernate.engine.spi.SessionImplementor; import org.hibernate.id.enhanced.TableGenerator; @SuppressWarnings("UnusedDeclaration") public class SybaseTableGenerator extends TableGenerator { @Override public synchronized Serializable generate(SessionImplementor session, Object obj) { return (Long) super.generate(session, obj) + 1; } }

Un poco complicado pero funciona;)