Java 配置Achiles如何正确使用实体方法?

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

我使用库来处理cassandra数据库。问题是,当我创建实体方法时,阿喀琉斯不会“看到”这些更改。见下面的例子

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));