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

时间:2014-08-24 08:51:46

标签: java cassandra persistence

我使用Achilles库来处理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");不影响实体和" old"值是持久的。对于我的观点(我已经看过调试调用堆栈),这是因为实际的User实体是Achilles代理的包装器,它对gettter / setter调用作出反应。此外,当我替换changeName时:调用直接getter / setter调用 - user.setName("newName"); user.setVersion(user.getVersion()+1);更新成为工作。

那么为什么会发生这种情况,是否有办法配置Achilles来响应非getter / setter方法调用?

2 个答案:

答案 0 :(得分:0)

您必须明确使用setter方法。

根据documentation,它仅拦截了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"

这可能是来自阿基里斯的设计选择,我建议你在issues页面上将其作为一个问题提出,所以它可能会得到作者的一些关注。

答案 1 :(得分:0)

在使用user执行任何操作之前,您应该从info.archinnov.achilles.persistence.PersistenceManager获取用户代理,然后才能使用setter / getters进行“用户”实体的修改。

User user = persistenceManager.getProxy(User.class, UUID.fromString(id));