JPA Datanucleus显示不再在数据存储区中的旧数据

时间:2014-05-31 18:50:32

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

我有两个实体:Account,Home。关系是这样的

@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;
    }

}

// HOME

@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查询帐户后,当我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();
        }
    }

1 个答案:

答案 0 :(得分:0)

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