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.
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?
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!