Rumah  >  Artikel  >  Hibernate 6 - IdentifierGenerator - Penjana lalai yang mewakilkan kepada NULL ID

Hibernate 6 - IdentifierGenerator - Penjana lalai yang mewakilkan kepada NULL ID

WBOY
WBOYke hadapan
2024-02-14 20:48:07457semak imbas

Salah satu ciri baharu dalam Hibernate 6 ialah pengenalan antara muka IdentifierGenerator. Dalam penjana lalai, Hibernate 6 akan mewakilkan kepada NULL ID sebagai pelaksanaan lalai. Dengan ciri baharu ini, pembangun boleh menyesuaikan penjanaan identiti untuk entiti dengan lebih fleksibel. Dalam artikel ini, editor PHP Yuzai akan memperkenalkan penggunaan dan contoh IdentifierGenerator dalam Hibernate 6.

Kandungan soalan

Saya mempunyai keperluan khusus untuk menetapkan dan menyimpan id entiti secara manual berdasarkan jadual pemetaan dalam sistem lama. Saya mencipta kelas yang melaksanakan fungsi ini sebelum menaik taraf kepada hibernate 6.

Asas kelas ini adalah menggunakan id yang diluluskan (iaitu bukan nol) atau "biar" hibernate menggunakan mekanisme lalainya untuk menjana nilai.

Saya mempunyai versi kod yang berfungsi untuk hibernate

@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;
    }
    
}

dan penggunaannya

@GenericGenerator( name = "CustomIdGenerator",
                   type = domain.util.CustomIdGenerator.class )
public class Tournament
{
    @Id
    @GeneratedValue( strategy = GenerationType.IDENTITY, generator = "CustomIdGenerator" )
    private Long id;
}

Ada idea tentang cara menyesuaikan kod ini agar berfungsi dengan hibernate 6?

Penyelesaian

Saya rasa sebagai penyelesaian anda boleh melakukan sesuatu seperti kaedah seterusnya memandangkan anda mempunyai sesi tersebut.

@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;
  }
}

Atau gunakan session.createnativequery() dan ekstrak nilai urutan seterusnya.

Atas ialah kandungan terperinci Hibernate 6 - IdentifierGenerator - Penjana lalai yang mewakilkan kepada NULL ID. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam