@Id @GeneratedValue pero establezca su propio valor de ID

Tengo una tabla con un ID generado, pero en algunos casos me gustaría configurarlo solo. ¿Puedo, de alguna manera, forzar a Hibernate a ignorar @GeneratedValue?

Puede ser una exageración pero ¿ha pensado en escribir su propio CustomIDGenerator que probablemente subclases dicen el AutoGenerator de hibernate y expone un par de métodos en los que puede establecer el id del siguiente objeto de clase que se generará, por ejemplo,

 class MyGenerator extends .... { public void setIdForObject(Class clazz, Long id) { //once you use this API, the next time an object of //type clazz is saved the id is used } public void setIdForObject(Class clazz, Long id, Matcher matcher) { //once you use this API, the next time an object of //type clazz is saved and the matcher matches yes the id will be //assigned. Your matcher can match properties like name, age etc //to say the matched object } } 

Esto podría ser complicado, pero al menos es posible según hibernate doco

Aunque esta pregunta se hizo hace bastante tiempo, encontré la respuesta perfecta para esta publicación en @lOranger, y quería compartirla.

Esta propuesta verifica si el ID actual del objeto está configurado en algo distinto de null , y si es así, lo usa, de lo contrario, lo genera usando la estrategia de generación predeterminada (o configurada).

Es simple, directo, y aborda el problema planteado por @Jens, de uno que no puede recuperar el ID actual del objeto.

Acabo de implementarlo (extendiendo el UUIDGenerator), y funciona como un encanto 😀

Para su caso de uso, puede agregar manualmente este no usuario. Una forma de hacerlo es colocar la operación de inserción en un archivo llamado “./import.sql” (en su classpath). Hibernate ejecutará estas declaraciones cuando se inicie SessionFactory.

crea tu propio generador de identificador / generador de secuencia

 public class FilterIdentifierGenerator extends IdentityGenerator implements IdentifierGenerator{ @Override public Serializable generate(SessionImplementor session, Object object) throws HibernateException { // TODO Auto-generated method stub Serializable id = session.getEntityPersister(null, object) .getClassMetadata().getIdentifier(object, session); return id != null ? id : super.generate(session, object); } } 

modifique su entidad como:

 @Id @GeneratedValue(generator="myGenerator") @GenericGenerator(name="myGenerator", strategy="package.FilterIdentifierGenerator") @Column(unique=true, nullable=false) private int id; ... 

y al guardar en lugar de usar persist() use merge() o update()