mysql 生成hibernate_使用MySQL和Oracle进行Hibernate自动密钥生成

小编典典

即使您使用时GenerationType.AUTO没有任何SEQUENCE特定参数,也将无法保存分配的标识符。

如果您愿意做出一些妥协,则有一些解决方法:

一种方法是切换到分配的标识符。您可以使用适用于MySQL和Oracle的UUID标识符,也可以手动分配值。

另一种方法是使用自定义表生成器。

首先,您定义一个可识别的接口:

public interface Identifiable {

T getId();

}

然后扩展表生成器:

public class AssignedTableGenerator extends TableGenerator {

@Override

public Serializable generate(SessionImplementor session, Object obj) {

if(obj instanceof Identifiable) {

Identifiable identifiable = (Identifiable) obj;

Serializable id = identifiable.getId();

if(id != null) {

return id;

}

}

return super.generate(session, obj);

}

}

此生成器能够将分配的标识符与合成的生成的标识符混合:

doInTransaction(session -> {

for (int i = 0; i < 5; i++) {

session.persist(new AssignTableSequenceIdentifier());

}

AssignTableSequenceIdentifier tableSequenceIdentifier = new AssignTableSequenceIdentifier();

tableSequenceIdentifier.id = -1L;

session.merge(tableSequenceIdentifier);

session.flush();

});

生成以下语句:

select tbl.next_val from sequence_table tbl where tbl.sequence_name=default for update

insert into sequence_table (sequence_name, next_val) values (default,1)

update sequence_table set next_val=2 where next_val=1 and sequence_name=default

select tbl.next_val from sequence_table tbl where tbl.sequence_name=default for update

update sequence_table set next_val=3 where next_val=2 and sequence_name=default

select tbl.next_val from sequence_table tbl where tbl.sequence_name=default for update

update sequence_table set next_val=4 where next_val=3 and sequence_name=default

select tbl.next_val from sequence_table tbl where tbl.sequence_name=default for update

update sequence_table set next_val=5 where next_val=4 and sequence_name=default

select tbl.next_val from sequence_table tbl where tbl.sequence_name=default for update

update sequence_table set next_val=6 where next_val=5 and sequence_name=default

select identityvs0_.id as id1_0_0_ from assigneTableIdentifier identityvs0_ where identityvs0_.id=-1

insert into assigneTableIdentifier (id) values (1, 2)

insert into assigneTableIdentifier (id) values (2, 4)

insert into assigneTableIdentifier (id) values (5, -1)

对于Oracle,您可以结合SEQUENCE和分配的生成器,如本文所述。

简而言之,请考虑以下生成器:

public class AssignedSequenceStyleGenerator

extends SequenceStyleGenerator {

@Override

public Serializable generate(SessionImplementor session,

Object obj) {

if(obj instanceof Identifiable) {

Identifiable identifiable = (Identifiable) obj;

Serializable id = identifiable.getId();

if(id != null) {

return id;

}

}

return super.generate(session, obj);

}

}

您可以将其映射到您的实体,如下所示:

@Id

@GenericGenerator(

name = "assigned-sequence",

strategy = "com.vladmihalcea.book.hpjp.hibernate.identifier.AssignedSequenceStyleGenerator",

parameters = @org.hibernate.annotations.Parameter(

name = "sequence_name",

value = "post_sequence"

)

)

@GeneratedValue(

generator = "assigned-sequence",

strategy = GenerationType.SEQUENCE

)

private Long id;

所有代码都可以在GitHub上使用,并且像一个超级按钮一样工作。

2020-06-20

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值