hibernate 6中的新特性之一是identifiergenerator接口的引入。在默认生成器中,hibernate 6将委托给null id作为默认实现。通过这个新特性,开发人员可以更灵活地自定义实体的标识生成。本文将由php小编鱼仔介绍hibernate 6中identifiergenerator的使用方法和示例。
我有一个特定要求,即根据旧系统中的映射表手动设置和保存实体的 id。我在升级到 hibernate 6 之前创建了一个实现此功能的类。
该类的基础是使用已传递的 id(即非空)或“让”hibernate 使用其默认机制来生成值。
我有一个适用于 hibernate < 6 的代码工作版本,现在需要升级,下面的代码不再适用。
@slf4j
public class customidgenerator implements identifiergenerator
{
@override
public serializable generate( final sharedsessioncontractimplementor session, final object obj )
{
serializable id = session.getentitypersister( null, obj ).getclassmetadata().getidentifier( obj, session );
if ( id == null || long.parselong( id.tostring() ) <= 0 )
{
// if the id is not set or is less than or equal to 0, let hibernate generate it.
log.debug( "hibernate will generate a new id for entity [{}]", obj.getclass().getname() );
id = super.generate( session, obj ); // cannot do this anymore!
}
else
{
log.debug( "using provided id [{}] for entity [{}]", id, obj.getclass().getname() );
}
return id;
}
}
及其用法
@GenericGenerator( name = "CustomIdGenerator",
type = domain.util.CustomIdGenerator.class )
public class Tournament
{
@Id
@GeneratedValue( strategy = GenerationType.IDENTITY, generator = "CustomIdGenerator" )
private Long id;
}
关于如何调整此代码以与 hibernate 6 配合使用有什么想法吗?
我想作为解决方案,您可以执行类似下一种方法的操作,因为您有会话。
@Slf4j
public class CustomIdentifierGenerator implements IdentifierGenerator {
@Override
public Serializable generate(SharedSessionContractImplementor session, Object obj) {
Serializable id = session.getEntityPersister( null, obj ).getClassMetadata().getIdentifier( obj, session );
if (id == null || Long.parseLong(id.toString()) <= 0) {
// If the ID is not set or is less than or equal to 0, let Hibernate generate it.
log.debug("Hibernate will generate a new ID for entity [{}]", obj.getClass().getName());
String sqlQuery = "SELECT MAX(id) FROM Tournament";
Optional<Long> query = session.createQuery(sqlQuery, Long.class).getResultStream().findFirst();
id = query.get() + 1;
} else {
log.debug("Using provided ID [{}] for entity [{}]", id, obj.getClass().getName());
}
return id;
}
}或者使用 session.createnativequery() 并提取序列的下一个值。
以上就是Hibernate 6 - IdentifierGenerator - 委托给 NULL ID 的默认生成器的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号