【问题标题】:JPA Datanucleus showing old data that is no longer in datastoreJPA Datanucleus 显示不再在数据存储中的旧数据
【发布时间】:2014-05-31 18:50:32
【问题描述】:

我有两个实体:帐户、主页。关系是这样的

@Entity
public class Account implements java.io.Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Key userId;
    private String data;
    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private List<Home> homes = new ArrayList<Home>();

    public Account() {
    }

    public Account(String data) {
        this. data = data;
    }

    public Account(String data, List<Home> homes) {
        super();
        this. data = data;
        this.homes = homes;
    }

    public List<Home> getHomes() {
        return homes;
    }

    public void setHomes(List<Home> homes) {
        this.homes = homes;
    }

}

//首页

@Entity
public class Home implements java.io.Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Key key;
    private long timestamp;
    private long userId;

    public Home(long latlong, long userId) {
        Key key = KeyFactory.createKey(Home.class.getSimpleName(), latlong + "" + userId);
        this.key = key;
        this.userId = userId;
    }

    //getters and setters
}

不变量使得用户的 latlong 永远不会改变。因此,当我添加一个 Home 实体时,如果该用户已经存在一个实体,它会在数据存储中简单地替换。到现在为止还挺好。但是我遇到了以下用户案例的问题:

假设用户 X 编辑了他的家庭数据 6 次。果然,当我查看数据存储时,Home 只有一个条目,其中包含最新数据。但是在使用 datanucleus 查询 Account 之后,当我执行 getHomes().size() 时,结果是 6。显然,datanucleus 将每个编辑缓存为一个单独的实体。这对我来说是个谜。我正在记录代码,所以我看到它正在发生:对于完全相同的键(我使用 for 循环),我正在获取实体的每次迭代/编辑。我如何防止这种情况发生?数据存储区清楚地显示了密钥的一个实体。我只想要一个实体:没有历史列表。

我的 datanucleus/jpa getById 是

@Override
    public T getById(Long id) {
        EntityManager mgr = getEntityManager();
        try {
            return null == id ? null : mgr.find(type, id);
        } finally {
            mgr.close();
        }
    }

【问题讨论】:

  • 会认为如果您感到困惑,然后查看日志以获取数据存储访问(所有记录的 IIRC),并使用包装器(也是 IIRC)包装集合字段。这样,您就可以将事情建立在“似乎”发生的事情之外,IMO

标签: google-app-engine jpa google-cloud-datastore datanucleus google-eclipse-plugin


【解决方案1】:

对于问题的根本原因仍然感到困惑,我将List 替换为Set,现在我的问题已经解决了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-15
    • 2015-03-04
    • 1970-01-01
    • 1970-01-01
    • 2015-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多