没有选择,springboot仍然存在

时间:2018-02-12 20:44:03

标签: spring-boot

拥有存储库:

public interface ContactRepository extends CrudRepository<JpaContact, UUID>

和各个实体注释:

@SelectBeforeUpdate(false)

springboot在调用时插入之前仍然会发出select:

contactRepository.save(new JpaContact);

问题:

  1. 有没有什么好的理由在插入之前自动选择?即使@Id是@GeneratedValue,它也找不到任何东西。如果它不是生成值,那么让db在主键约束上失败并通过单独选择找到重复的持久性有什么不对?
  2. 如何正确禁用这种不良行为?我只能通过直接使用EntityManager来绕过这个,但这不应该是正确的方法。

1 个答案:

答案 0 :(得分:0)

如果他们偶然发现了这个问题,请帮助他人:

  1. @SelectBeforeUpdate(false)似乎没有效果,不明白为什么。
  2. 在我的情况下,问题是,CrudRepository只有save方法,它使用magic来确定记录是新持久还是旧合并。这绝对是不必要的,并且像EntityManager一样持久/合并会在这里做得更好。您可以实施Persistable或EntityInformation来帮助确定是否保存&#39;是坚持&#39;或者&#39;合并&#39;你必须合作,才能使魔法发挥作用。
  3. 我的错误是,我手动生成UUID,生成的UUID @ID字段被视为旧的合并值。所以我的理解是,如果你从客户端获得UUID并且只想坚持,你可以使用insert语句,或者你可以在插入之前使用额外的select,或者你可以实现上面的接口,或者某种类型自定义IdGenerator。我亲自更改了流程,以便在db级别生成UUID,现在它可以正常工作。