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

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

WBOY
Lepaskan: 2024-02-14 20:48:07
ke hadapan
473 orang telah melayarinya

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;
    }
    
}
Salin selepas log masuk

dan penggunaannya

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

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;
  }
}
Salin selepas log masuk

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!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan