I am migrating a project to spring boot 3 and hibernate 6.
I had this class that was used to generate ids if they were not provided:
import java.io.Serializable;
import .hibernate.HibernateException;
import .hibernate.engine.spi.SessionImplementor;
import .hibernate.id.IdentityGenerator;
import .springframework.beans.BeanWrapper;
import .springframework.beans.PropertyAccessorFactory;
public class UseIdOrGenerate extends IdentityGenerator {
// @Override
public Serializable generate(SessionImplementor session, Object obj) {
if (obj == null)
throw new HibernateException(new NullPointerException());
BeanWrapper forBeanPropertyAccess = PropertyAccessorFactory.forBeanPropertyAccess(obj);
if (!forBeanPropertyAccess.isReadableProperty("id") || forBeanPropertyAccess.getPropertyValue("id") == null) {
return super.generate(session, obj);
} else {
return (Serializable) forBeanPropertyAccess.getPropertyValue("id");
}
}
}
Now in hibernate 6 this no longer works.
I thought I would replace it like this:
import .hibernate.engine.spi.SharedSessionContractImplementor;
import .hibernate.id.IdentifierGenerator;
import .springframework.beans.BeanWrapper;
import .springframework.beans.PropertyAccessorFactory;
public class UseIdOrGenerate implements IdentifierGenerator {
@Override
public Object generate(SharedSessionContractImplementor session, Object entity) {
BeanWrapper beanWrapper = PropertyAccessorFactory.forBeanPropertyAccess(entity);
Object currentId = beanWrapper.getPropertyValue("id");
if (currentId != null) {
return currentId;
} else {
return super.generate(session, entity)
}
}
}
But the generate
method no longer exists.
What is the correct way to do this in hibernate 6?