我有一个有六个属性和一个更改日期的类。
@Entity
@Table(name = "product")
public class Product {
private Long id;
private String title; // if changed, update lastChanged
private String subtitle;
private Text summary; // if changed, update lastChanged
private Text description; // if changed, update lastChanged
private Text otherText;
private List<Text> reviews; // if changed, update lastChanged
private Date lastChanged;
// Getters and setters
}
-
@Entity
@Table(name = "text")
public class Text {
private Long id;
private String content;
private int typeCode;
// Getters and setters
}
(这显然是我们实际领域模型的大规模简化版本,但它说明了基本问题)
要求是:如果“title”、“summary”、“description”或“reviews”发生变化,请将“lastChanged”设置为当前日期。
背景:这些字段与外部 API 相关。我的客户想知道,自 X 日以来,哪些产品对其 API 相关字段进行了更改。
我试图通过实现 Hibernate Interceptors 和 Hibernate Event Listeners 来满足要求。他们都没有像我希望的那样工作。例如,当我更改“摘要”时,Hibernate 只会告诉我:“文本”表中的“内容”字段已更改。
这个信息不是很有用,因为我仍然不知道'summary'、'description'或'otherText'是否被改变了。因此我不知道是否需要更新“lastChanged”。
我的其他想法:
获取已更改的 Text 对象的 id 并尝试通过 SQL 查找与其连接的产品。这可能会起作用,但它是一个非常丑陋的解决方案,并且它会与我们的域模型变得非常复杂。
在变量设置器中实现更新逻辑。这样做有两个问题:Hibernate 在从数据库加载对象时调用 setter(这当然不会导致更新时间戳)并且它不能解决上述问题。如果“内容”的设置器被调用,那会怎样?我不知道,产品的哪个属性被改变了。
这个问题有什么优雅的解决方案吗?