簡體   English   中英

配置Achiles如何正確使用實體方法?

[英]How configure Achiles work with entity methods properly?

我使用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"); 不會影響實體,並且“舊”值會保留。 就我的觀點(我已經看到了調試調用堆棧),發生這種情況是因為實際的用戶實體是使用Achilles代理包裝的,該代理對gettter / setter調用做出反應。 同樣,當我替換changeName :調用直接進行getter / setter調用user.setName("newName"); user.setVersion(user.getVersion()+1); 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"

這可能是阿喀琉斯的一個設計選擇,我建議您在問題頁面上將其作為一個問題提出,因此它可能會引起作者的注意。

在對user執行任何操作之前,您應該從info.archinnov.achilles.persistence.PersistenceManager獲取用戶代理,並且僅在此之后才使用setter / getter對“ user”實體進行修改。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM