我有两个实体: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();
}
}
答案 0 :(得分:0)
对于问题的根本原因仍然感到困惑,我将List
替换为Set
,我的问题现在已经解决了。