【问题标题】:JPA default value if Entity not found如果未找到实体,则 JPA 默认值
【发布时间】:2015-12-02 21:32:00
【问题描述】:

如果找不到实体(仅当找不到实体 - EntityNotFound 异常),有没有办法设置一些(默认)值?如果 DB 中有空值,则该字段必须为空。 例如,我有一个实体 First 与实体 Second 有关系:

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

如果 DB(表“First”)中的“second”列为 null,则 first.second 必须为 null。如果 DB 中的列“第二”(表“第一”)是 5(第二个 id = 5)并且表“第二”中不存在 id == 5 的行,那么 firts.second 应该是一些默认值(实体) ,例如 id = 1 的实体 Second 或 new Second(params);

【问题讨论】:

    标签: java hibernate jpa annotations many-to-one


    【解决方案1】:

    我希望您通过一对 get/set 方法访问您的字段。只需在 getter 中创建空检查逻辑即可:

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

    也请看这个答案https://stackoverflow.com/a/757330/149818

    【讨论】:

    • 是的,我使用 get/set 方法。但只有在发生 EntityNotFound 异常时我才需要 defaultValue 。如果字段“second”为空且没有异常,则归档的 «second» 应为空(不是 defaultValue)
    • 当您使用关系时,您会得到空数组而不是 EntityNotFound - JPA 不会引发异常来解决相关问题。所以在 get 方法中使用空大小检查
    • 当某个表包含指向不包含所需数据的其他表的链接时,我得到 EntityNotFound
    【解决方案2】:
    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;
       }
    }
    

    【讨论】:

    • 这几乎就是我所需要的。只是如何通过另一个 Second 对象(宽度不同的 id)初始化字段“second”?
    • 请看我编辑的答案。您可能会发现 @PostLoad 回调对此很有用。
    • 这个方法解决了问题!我可以使用@PostLoad 方法和 AutowireHelper.autowire (this, someService) 设置一个新值;例如:
    • 这个方法解决了问题!我可以使用@PostLoad 方法和 AutowireHelper.autowire (this, this.secondService) 设置一个新值;自动装配类中的服务字段。但是随后hibernate会更新数据库中的这个字段。我使用了注释 @org.hibernate.annotations.Entity(dynamicUpdate = true) 但hibernate认为该字段已更改。有没有办法为休眠未在数据库中更新它的字段设置值?
    • 在这种情况下,根本不设置字段值并使用getter获取值,如答案的第一部分所述。
    猜你喜欢
    • 1970-01-01
    • 2016-09-01
    • 1970-01-01
    • 2019-04-12
    • 2013-02-25
    • 2010-11-22
    • 2019-11-24
    • 2021-10-22
    • 2021-07-13
    相关资源
    最近更新 更多