环境
springdataJpa 2.3.10
hibernate-core: 5.4.30
问题
debug得 自定义策略生效 并且通过了一层判定
AbstractSaveEventListener的saveWithGeneratedIdperformSave
performSave中重新生成了key,此key即形似数据库中最终保存的主键
随后进入判定
return this.invokeSaveLifecycle(entity, persister, source) ? id : this.performSaveOrReplicate(entity, key, persister, useIdentityColumn, anything, source, requiresImmediateIdAccess);
未通过persister.implementsLifecycle() 判定 返回了false
protected boolean invokeSaveLifecycle(Object entity, EntityPersister persister, EventSource source) {
if (persister.implementsLifecycle()) {
LOG.debug("Calling onSave()");
if (((Lifecycle)entity).onSave(source)) {
LOG.debug("Insertion vetoed by onSave()");
return true;
}
}
return false;
}
public boolean implementsLifecycle() {
return this.getEntityTuplizer().isLifecycleImplementor();
}
相关代码
自定义策略
/**
* 当新数据指定了自定义id时 使用自定义id
* 参考:
* https://stackoverflow.com/questions/11667929/jpa-override-auto-generated-id
* https://jianshu.com/p/db5f10b546df
*/
public class CustomUUIDGenerator extends UUIDGenerator {
@Override
public Serializable generate(SharedSessionContractImplementor session, Object object) throws HibernateException {
try {
Serializable id = session.getEntityPersister(null, object).getClassMetadata().getIdentifier(object, session);
if (id != null)
//TODO 未生效
return id;
} catch (Exception e) {
return super.generate(session, object);
}
return super.generate(session, object);
}
}
指定策略
@Id
@GeneratedValue(generator = "custom-uuid-generator")
@GenericGenerator(name = "custom-uuid-generator", strategy = "com.ect.core.entity.CustomUUIDGenerator")
@Column(name = "UUID", nullable = false, columnDefinition = "char(32)")
private String id;
参考链接:
stackoverflow.com/questions/3…