java-需要知道每个字段是否已更改,如何在Hibernate中对此建模
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java-需要知道每个字段是否已更改,如何在Hibernate中对此建模,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2071字,纯文字阅读大概需要3分钟。
内容图文
所以我有一个带有三个字段的类,它们使用休眠模式映射到一个表
Class Widget
{
String field1;
String field2;
String field3;
}
在应用程序启动时,这些小部件会从外部文件添加到数据库的许多实例中,但是当我退出应用程序时,我需要知道自应用程序启动以来用户已更改了这些字段中的哪些(如果有),因此更改可以保存回文件中.我还需要存储原始值以进行日志记录.
无论我是否需要表中的状态字段,或者是否已经有使用Hibernate / Database的方法,都无法使用.
编辑:下面给出了对该程序的一个好的解决方案.但是,我使用Hibernate的主要原因是为了减少内存消耗,因此在更改时存储原始值对我来说不是一个好的解决方案,我希望将一切都存储在数据库中.所以我创建了这个新问题How do I store a copy of each entity I add to database in Hibernate
解决方法:
给定如下所示的实体,您可以跟踪其中一个字段的更改(同时也保留其原始值).
@Entity
@Table(schema = "test", name = "test")
public final class Test {
private static final int ORIGINAL = 0;
private static final int CURRENT = 1;
private Integer id;
// holds the original and current state of the field
private final AtomicReferenceArray<String> field = new AtomicReferenceArray<>(2);
@Id
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Transient
public String getOriginalField() {
return field.get(ORIGINAL);
}
@Basic
public String getField() {
return field.get(CURRENT);
}
public void setField(String field) {
this.field.compareAndSet(ORIGINAL, null, field);
this.field.set(CURRENT, field);
}
@PreUpdate
public void preUpdate() {
System.out.format("Original: %s, New: %s\n", getOriginalField(), getField());
}
...
}
如果这样的数据库中只有一行:
id: 1
field: a
version: 2011-12-02 11:24:00
在字段更新之前(例如,从a到b),您将获得以下输出.
Original: d, New: b
即使该实体被多次更新,原始值也将保留下来,并且可以通过相应的getter(getField和getOriginalField,在命名上您会比我更有创造力)来访问两种状态.
这样,您可以避免在数据库中创建版本列,也可以向客户端隐藏实现详细信息.
可以使用数组,列表等代替AtomicReferenceArray来跟踪所有更改,就像这样.
@PreUpdate当然不是必需的,但是通过这种方式,可以通知您实体状态的更改,并自动将更新的字段保存到文件中.还有更多类似这些的注释:有关其他注释类型,请参见javax.persistence的文档.
内容总结
以上是互联网集市为您收集整理的java-需要知道每个字段是否已更改,如何在Hibernate中对此建模全部内容,希望文章能够帮你解决java-需要知道每个字段是否已更改,如何在Hibernate中对此建模所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。