【问题标题】:Hibernate storing derived propertyHibernate 存储派生属性
【发布时间】:2023-04-10 23:55:01
【问题描述】:

我有一个由 Hibernate 持久化的类,它具有派生属性 isComplete

@Entity
class Container {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column
    private Long id;

    @Column private String oneFish;
    @Column private String twoFish;
    @Column private String redFish; 
    @Column private String blueFish;

    public Boolean isComplete(){
        return oneFish != null 
               && twoFish != null  
               && redFish != null 
               && blueFish != null;
    }
}

如何让 Hibernate 将 isComplete 持久化到数据库,以便其他(非休眠)访问可以看到该值?

【问题讨论】:

标签: java hibernate


【解决方案1】:

如果您使用 @Column 注释该方法,它将被持久化(您可能必须在实体上指定 @AccessType / @Access

但你不应该那样做。存储所有其他值并在需要时计算isComplete。这不是一项昂贵的手术。你甚至可以在@Transient Boolean 属性中“缓存”它,但它不需要进入数据库。

【讨论】:

  • 我希望它进入数据库,这就是重点。我想要数据库中的这个派生列。
  • 为什么?你正在制造许多潜在的问题(无论如何,我的第一段回答了你的问题)
  • 正如 Paul 所说,这是为了数据库中数据的其他消费者的利益 - 即不运行他的代码的应用程序。完整性的计算是域逻辑(尽管显然非常简单的域逻辑);让每个消费者都实现它会引入重复,并且随之而来的是一整类错误的风险。
  • 另一方面,这意味着如果任何其他值发生变化,您应该始终重新计算派生值。我认为这可能会引入更多错误。
【解决方案2】:

我正在使用 XML Hibernate 映射,但如果我正确理解 Hibernate 注释,您可以将 isComplete() 注释为 @Column 并提供无操作设置器 setComplete()。

【讨论】:

    猜你喜欢
    • 2013-03-26
    • 1970-01-01
    • 1970-01-01
    • 2016-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多