如果实体未找到,JPA的默认值是什么?

3

如果实体未找到(仅在未找到实体时),是否有一种方法设置一些(默认)值? 如果DB中有null值,则该字段必须为null。 例如,我有一个名为First的实体,与一个名为Second的实体有关系:

class First {
   ...
   @ManyToOne @JoinColumn(name="second", nullable=true)
   @NotFound(action = NotFoundAction.IGNORE)
   Second second;
   ...
}

如果数据库中 "First" 表的 "second" 列为 null,则 "first.second" 必须为 null。如果数据库中 "First" 表的 "second" 列为 5(第二个 ID = 5),并且在表 "Second" 中不存在 ID == 5 的行,则 "first.second" 应该是某个默认值(实体),例如 ID = 1 的实体 Second 或 new Second(params)。
2个回答

1

我希望您通过一对get/set方法来访问您的字段。只需在getter中添加空值检查逻辑:

public Second getRelated(){
    if( second == null )
        return defaultValue;
}

请参考这个答案https://dev59.com/BHRB5IYBdhLWcg3wiHv7#757330


1
是的,我使用get/set方法。但是只有在出现EntityNotFound异常时,我才需要defaultValue。如果字段“second”为null且没有异常,则字段“second”应该为null(而不是defaultValue)。 - Vadim
当您使用关系时,如果实体未找到,您将获得空数组 - JPA不会引发异常来解决相关问题。因此,请在get方法内使用空大小检查。 - Dewfy
当某个表包含指向其他表的链接,而该表没有所需数据时,我会收到“EntityNotFound”错误。 - Vadim
请查看以下两个答案:https://dev59.com/rGUp5IYBdhLWcg3wHUri - Dewfy

1
class First {
   ...
   @ManyToOne @JoinColumn(name="second", nullable=true)
   @NotFound(action = NotFoundAction.IGNORE)
   Second second;

   @Column(name = "second", insertable = false, updatable = false)
   private Long secondId;

   public Second getSecond(){
      if (second == null && secondId != null) {
        return defaultSecond;
      }
      return second;
   }
}

如果您想将“second”字段本身更改为默认值,则可以添加“@PostLoad”回调函数:
public Second getSecond(){
   return second;
}

@PostLoad
private void postLoad() {
   if (second == null && secondId != null) {
      this.second = defaultSecond;
   }
}

这几乎是我需要的。只需要如何通过另一个具有不同id的Second对象来初始化"second"字段? - Vadim
这种方法解决了问题!我可以使用@PostLoad方法和AutowireHelper.autowire(this,someService)设置新值;例如: - Vadim
这种方法解决了问题!我可以使用@PostLoad方法设置新值,并使用AutowireHelper.autowire (this, this.secondService)自动装配类中的service字段。但是,hibernate会更新数据库中的此字段。我使用了注释@org.hibernate.annotations.Entity(dynamicUpdate = true),但是Hibernate认为该字段已更改。有没有一种方法可以设置该字段的值,使Hibernate不会在数据库中更新它? - Vadim
在这种情况下,只需不设置字段值,并使用getter获取该值,如答案的第一部分所述。 - Dragan Bozanovic
好的,我认为这就是我需要的全部。谢谢! - Vadim
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接