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中文網其他相關文章!