我的实体类具有id字段,并且使用@Id
,并且其策略为null。默认策略为@GeneratedValue(strategy = GenerationType.AUTO))
。
当我调用JPA保存方法时,它总是在插入之前先调用sql select ,查询日志就像下面这样:
首次查询:
Hibernate: select dataeviden0_.id as id1_0_0_, dataeviden0_.block_hash as block_ha2_0_0_ from table1 dataeviden0_ where dataeviden0_.id=?
第二个查询:
Hibernate: insert into table1 (block_hash, id) values (?, ?)
我可以自己控制id,我希望jpa在插入之前忽略select,怎么办?
答案 0 :(得分:1)
您可以使用persist()
方法而不是save()
。
https://forum.hibernate.org/viewtopic.php?f=1&t=1011405
但是,与save()不同,persist()不能保证标识符值将在持久实例上立即设置。
答案 1 :(得分:1)
@Alien现在不再删除的答案基本上是正确的。该语句来自使用merge
的Spring Data JPA,如果您使用persist
,则该语句应消失。
为此,您必须在存储库中公开persist
方法。使用custom method implementation和注入的EntityManager
应该很容易。如果仅使用该存储库保存新实例,则可以根据需要甚至为现有save
方法提供自定义实现。
答案 2 :(得分:1)
bulk-inserting-existing-data-preventing-jpa-to-do-a-select-before-every-insert解决了我的问题,该实体实现Persistable,并覆盖isNew(){return false; },它将在插入之前忽略select,因为
@Transactional
public <S extends T> S save(S entity) {
if (entityInformation.isNew(entity)) {
em.persist(entity);
return entity;
} else {
return em.merge(entity);
}
它的save方法将判断EntityInformation.isNew(entity)为假,并达到我的目标。