【发布时间】: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