当前位置: 首页 > 知识库问答 >
问题:

如果主键不为空,Spring Data JPA不允许对实体进行验证

沈华皓
2023-03-14

我有一个订阅者实体,它使用用户提供的电子邮件地址作为主键,而不是自动生成的值。这意味着当调用JPararePository的save方法时,主键值不为空。

Spring Data JPA文件第2.2.1节表2.2说明如下:

默认情况下,Spring Data JPA检查给定实体的id属性。如果Id-Property为null,则该实体将被认为是新的,否则将被认为不是新的。

这种行为会阻止新的订阅者实体持久化到数据库中。

共有1个答案

彭华皓
2023-03-14

当涉及到决定如何选择实体的主键时,我们有两个选项。1.使用spring 2提供的自动生成密钥。使用自定义主键,例如电子邮件地址。

自动生成的密钥使用起来更简单。在持久化实体时,spring注意到id字段为空,并得出结论认为这是一个正在持久化的新实体。一个新的自动生成的值被分配给id字段,并且实体被持久化。但是,如果要确保不持久化具有相同电子邮件地址的两个实体,请记住用@column(unique=“true”)注释电子邮件字段。由于email字段的唯一约束,检测重复项也很容易。

但是,有时您不希望使用自动生成的密钥,因为您可能希望使用用户提供的电子邮件地址作为密钥。这种做法是没有问题的。用@id标记实体中的电子邮件字段。仅此而已。但是,重复检测是不可能的。如果多次收到创建具有相同电子邮件地址的实体的请求,则每次都会更新同一实体,即每次都会做EntityManager.merge()。将不会引发约束冲突异常。回想一下,spring总是检查主键字段是否为空,以决定是创建新的实体还是合并到现有的实体中。

 类似资料:
  • 问题内容: 如JDK文档中所指定,Hashtable不允许空键或值。HashMap允许一个null键和任意数量的null值。为什么是这样? 问题答案: Hashtable是较老的类,通常不鼓励使用Hashtable。也许他们看到了对null键的需求,更重要的是对null值的需求,并将其添加到HashMap实现中。 HashMap是较新的,并且具有更高级的功能,这些基本上只是对Hashtable功能

  • 在Java9中,为、和接口引入了新的工厂方法。这些方法允许在一行中快速实例化具有值的Map对象。现在,如果我们考虑: 以上内容是允许的,没有任何例外,如果我们这样做: 我知道HashMap可以将null作为键和值,但为什么在Map.of的情况下会受到限制呢? 同样的情况也发生在和中。

  • 问题内容: 我正在使用Hibernate和JPA。我有一个实体,它引用了: 但是在我的数据库中,有些客户没有父母,因此将设置为。我在测试班级时遇到的异常是: 有没有一种方法来设置,以当id为? 问题答案: 尝试这个

  • 试图在下载目录中保存PDF文件,但在Android Q后,被完全弃用后,除了DCIM或Pictures文件夹之外,没有办法将文件保存到任何其他位置,因为在尝试将文件保存到该位置时引发了以下异常。 有以下代码。 显然,当将路径更改为DIRECTORY_DCIM时,所有工作都按预期进行,但由于需要,文件应该像以前一样保存到下载中。会很感激任何帮助。

  • 问题内容: Varchar(max)列不允许作为SQL Server中的主键。 可以作为主键的varchar类型的最大长度是多少? 这可能是一个不好的做法,但遇到了这种情况。 问题答案: 900个字节是主键的最大长度,这在我看来是个坏主意,为什么不使用替代键呢?

  • 我想允许只访问一个特定的Rest点而不进行身份验证。 控制器: 如果将antMatchers保留如上所示,我可以禁用两个点的身份验证。但我的目标是只允许带有id参数的GET通过而不进行身份验证。我尝试了Controller.myPath+“?id=**”,但它不起作用。有什么想法吗?多谢了。