Java 配置Achiles如何正确使用实体方法?
我使用库来处理cassandra数据库。问题是,当我创建实体方法时,阿喀琉斯不会“看到”这些更改。见下面的例子Java 配置Achiles如何正确使用实体方法?,java,cassandra,persistence,Java,Cassandra,Persistence,我使用库来处理cassandra数据库。问题是,当我创建实体方法时,阿喀琉斯不会“看到”这些更改。见下面的例子 import info.archinnov.achilles.persistence.PersistenceManager; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public clas
import info.archinnov.achilles.persistence.PersistenceManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class AhilesTest {
private static final UUID ID = UUID.fromString("083099f6-e423-498d-b810-d6c564228724");
//This is achilles persistence manager
@Autowired
private PersistenceManager persistenceManager;
public void test () {
//user creation and persistence
User toInsert = new User();
toInsert.setId(ID);
toInsert.setName("name");
toInsert.setVersion(0l);
persistenceManager.insert(toInsert);
//find user
User user = persistenceManager.find(User.class, id);
user.changeName("newName");
persistenceManager.update(user);
User updatedUser = persistenceManager.find(User.class, id);
//here old "name" value is returned
updatedUser.getName();
}
public class User {
private UUID id;
private String name;
private long version;
public void changeName (String newName) {
this.name = newName;
this.version++;
}
//getters and setters are omited
}
}
user.changeName(“newName”)代码>不影响实体,“旧”值被持久化。在我看来(我见过调试调用堆栈),这是因为实际的用户实体是带有Achiles代理的包装器,它对getter/setter调用作出反应。同样,当我替换changeName
时:调用直接getter/setter调用-user.setName(“newName”);user.setVersion(user.getVersion()+1)代码>更新变成了工作
那么为什么会发生这种情况呢?有没有办法配置Achilles来响应非getter/setter方法调用?您必须明确使用setter方法
根据,它只截获setter方法
"As a consequence of this design, internal calls inside an entity cannot be intercepted
and will escape dirty check mechanism. It is thus recommended to change state of the
entities using setters"
这可能是阿喀琉斯的一个设计选择,我建议你在页面上把它作为一个问题提出来,因此,它可能会受到作者的一些关注。在对用户执行任何操作之前,您应该从info.archinnov.achiles.persistence.persistence.PersistenceManager
获取用户代理,然后才使用setter/getter对“user”实体进行修改
User user = persistenceManager.getProxy(User.class, UUID.fromString(id));