【问题标题】:force insert with spring data jpa使用弹簧数据 jpa 强制插入
【发布时间】:2012-10-18 16:39:35
【问题描述】:

我想强制 CrudRepository#save(entity) 插入一个新实体,而不是先选择实体并在主键已经存在时更新它。

我试着举个例子

public class Lock
{
    @Id
    @Column
    private UUID uuid;
    ...
}


UUID id = UUID.randomUUID();
Lock firstLock = new Lock(id);
Lock secondLock = new Lock(id);
repo.save(firstLock);
repo.save(secondLock);

发生的情况是,第一个保存操作执行了以下两个语句

Hibernate: select lock0_.uuid as uuid5_0_, lock0_.expires as expires5_0_ from locks lock0_ where lock0_.uuid=?
Hibernate: insert into locks (expires, uuid) values (?, ?)

当第二次调用 save 执行更新语句时

Hibernate: select lock0_.uuid as uuid5_0_, lock0_.expires as expires5_0_ from locks lock0_ where lock0_.uuid=?
Hibernate: update locks set expires=? where uuid=?

如何确保第二次调用 save 不会简单地更新先前存储的记录?我希望它执行插入语句并失败,因为相同的主键已经存在

【问题讨论】:

    标签: java spring-data-jpa


    【解决方案1】:

    在 Spring Data JPA 中不允许对 id 不为 null 的实体强制插入。

    通常 Id 生成器用于确保生成的 id 是唯一的主键。 (例如@GeneratedValue(strategy = GenerationType.AUTO))

    我认为这种行为是正确的。在 ORM 中,使用 new 运算符表示打算创建一个新实体,并隐含要求为其分配一个唯一的 id。

    但如果你想尝试一下,你可以查看自定义的@GenericGenerator。

    http://www.georgestragand.com/jpaseq.html

    【讨论】:

      猜你喜欢
      • 2016-06-17
      • 2019-03-17
      • 1970-01-01
      • 2017-07-06
      • 1970-01-01
      • 2017-11-07
      • 2014-03-28
      • 2017-06-10
      • 2016-06-02
      相关资源
      最近更新 更多