首頁  >  文章  >  Hibernate 6 - IdentifierGenerator - 委託給 NULL ID 的預設產生器

Hibernate 6 - IdentifierGenerator - 委託給 NULL ID 的預設產生器

WBOY
WBOY轉載
2024-02-14 20:48:07457瀏覽

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

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除