Gan*_*row 14 java caching annotations hibernate jpa
我们假设我有这门课程:
@EntityListeners({MyListener.class})
class MyClass {
String name;
String surname;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSurname() {
return name;
}
public void setSurname(String name) {
this.name = name;
}
public void save() {
JPA.em().persist(this);
return this;
}
public void update() {
JPA.em().merge(this);
}
public static MyClass findById(Long id) {
return JPA.em().find(MyClass.class, id);
}
}
Run Code Online (Sandbox Code Playgroud)
现在,在我的MyListener课程中,我试图弄清楚之前的值MyClass实例与即将保存(更新)到数据库的新值.我用preupdate metdhod做到这一点:
@PreUpdate
public void preUpdate(Object entity) {
...some logic here...unable to get the old object value in here
}
Run Code Online (Sandbox Code Playgroud)
假设我有一个MyClass名称和姓氏的对象实例:
MyClass mycls = new MyClass();
mycls.setName("Bob");
mycls.setSurname("Dylan");
mycls.save();
Run Code Online (Sandbox Code Playgroud)
这听起来没有,这是好的,因为我只是在听更新.现在,如果我像这样更新这个实例:
MyClass cls = MyClass.findById(someLongId)
cls.setSurname("Marley");
cls.update();
Run Code Online (Sandbox Code Playgroud)
所以这会触发preUpdatemylistener中的方法,当我尝试:
MyClass.findById(someLongId);
Run Code Online (Sandbox Code Playgroud)
当我调试时,我已经获得了新更新的实例,但更新尚未发生,因为当我在列姓中检入数据库时,它仍然存在Dylan.
如何从我的preUpdate方法中获取数据库中的值而不是我刚刚更新的值?
Ren*_*ink 22
我认为一种简单的方法是将先前的值保存在JPA不会持久的瞬态变量中.因此,只需引入变量previousSurname并在设置器中覆盖它之前保存实际值.
如果你想保存多个属性,如果你的类它会很容易MyClass为Serializable.
如果是这样,添加一个post load listener
public class MyClass implements Serializable {
@Transient
private transient MyClass savedState;
@PostLoad
private void saveState(){
this.savedState = SerializationUtils.clone(this); // from apache commons-lang
}
}
Run Code Online (Sandbox Code Playgroud)
但请注意,这savedState是一个独立的实例.
然后,您可以访问您的先前状态EntityListener.
您还可以将PostLoad侦听器移动到EntityListener该类.但是,您需要访问该savedState字段.我建议,使其无论是封装作用域或使用包范围的访问,并把MyClass与MyListener在同一个包,
public class MyListener {
@PostLoad
private void saveState(MyClass myClass){
myClass.saveState(SerializationUtils.clone(myClass)); // from apache commons-lang
}
}
public class MyClass implements Serializable {
@Transient
private transient MyClass savedState;
void saveState(MyClass savedState){
this.savedState = savedState;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9179 次 |
| 最近记录: |