How to get the auto-increment primary key value in MySQL using Hibernate
我正在使用Hibernate访问MySQL,并且我有一个带有自动递增主键的表。
每次我在表中插入一行时,都不需要指定主键。但是,在插入新行之后,如何立即使用hibernate获取相对主键?
或者我可以只使用jdbc来做到这一点?
保存hibernate实体时,将为您填充
1 2 3 4 5 6 7 |
实际上,我几乎总是在测试中对持久实体的id进行
持久化对象后,应该可以调用getId()或任何@ID列,因此可以从方法中返回它。您还可以使Hibernate一级缓存无效,然后再次获取它。
但是,为了可移植性,您可能需要考虑将Hibernate与序列样式ID生成一起使用。如果需要,这将简化从MySQL的过渡。当然,如果使用这种类型的生成器,则可以立即获取ID,因为Hibernate需要在持久化对象之前解析列值:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | @Id @GeneratedValue (generator="MY_SEQ") @GenericGenerator( name ="MY_SEQ", strategy ="org.hibernate.id.enhanced.SequenceStyleGenerator", parameters = { @Parameter(name ="sequence_name", value ="MY_SEQ"), @Parameter(name ="initial_value", value ="1"), @Parameter(name ="increment_size", value ="10") } ) @Column ( name ="id", nullable = false ) public Long getId () { return this.id; } |
这有点复杂,但是除了更改SEQUENCE名称外,还可以剪切和粘贴。
在自动增量生成器类的情况下,当我们使用
并返回
如果需要,可以使用以下方法独立于对象来获取下一个主键:
1 2 3 4 5 |
在Hibernate中调用save()方法时,该对象不会立即写入数据库。当您尝试从数据库(从同一张表中读取)或显式调用flush()时,就会发生这种情况。在相应的记录未插入数据库表之前,MySQL不会为其分配ID。
因此,id是可用的,但是在Hibernate实际上将记录插入MySQL表之前没有。