example - jpa java
@Id @GeneratedValue pero establezca su propio valor de ID (4)
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?
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 :-D
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.
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
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()