Java 并发修改-JPA AppEngine
我在我的谷歌应用程序引擎web应用程序中使用Java和JPA1。我在Java 并发修改-JPA AppEngine,java,google-app-engine,jpa,Java,Google App Engine,Jpa,我在我的谷歌应用程序引擎web应用程序中使用Java和JPA1。我在中遇到了这个问题,原因是:javax.transaction.xa.XAException:并发修改 Profile和ViewedProfile以及相应的getter和setter: public class Profile { ... @OneToOne(cascade={CascadeType.PERSIST, CascadeType.REMOVE}) private ViewedProfile vi
中遇到了这个问题,原因是:javax.transaction.xa.XAException:并发修改
Profile
和ViewedProfile
以及相应的getter和setter:
public class Profile {
...
@OneToOne(cascade={CascadeType.PERSIST, CascadeType.REMOVE})
private ViewedProfile viewed = null;
...
}
public class ViewedProfile {
...
private LinkedHashSet<String> viewedBy = null;
private LinkedHashSet<String> profilesViewed = null;
...
}
我怀疑问题出在LinkedHashSet上,所以我在另一个项目中进行了尝试
public class Person {
private LinkedHashSet<String> viewers = null;
public LinkedHashSet<String> getViewers() {
return viewers;
}
public void setViewers(LinkedHashSet<String> viewers) {
this.viewers = viewers;
}
}
公共类人物{
私有LinkedHashSet查看器=null;
公共LinkedHashSet GetViewer(){
返回观众;
}
公共无效集查看器(LinkedHashSet查看器){
this.viewers=观众;
}
}
然后对集合进行修改:
Person p = new Person();
LinkedHashSet<String> viewers = new LinkedHashSet<String>();
viewers.add("one");
viewers.add("two");
viewers.add("three");
viewers.add("four");
p.setViewers(viewers);
p.getViewers().remove(p.getViewers().iterator().next());
p.getViewers().remove("two");
p.getViewers().add("two");
for (String s: p.getViewers()){
System.out.println(s);
}
Person p=新人();
LinkedHashSet查看器=新建LinkedHashSet();
观众。添加(“一”);
添加(“两个”);
添加(“三”);
观众。加上(“四”);
p、 设置查看器(查看器);
p、 getViewers().remove(p.getViewers().iterator().next());
p、 getViewers().删除(“两个”);
p、 getViewers()添加(“两个”);
for(字符串s:p.getViewers()){
系统输出打印项次;
}
但这一个有效。有什么帮助吗?谢谢使用一些古老版本的GAE JPA插件不会有什么帮助,所以改用2.x版(已经存在了几年的版本)可能有影响现在更新为JPA2,但仍然遇到错误。但该异常跟踪未显示任何ConcurrentModificationException的源-查看GAE JPA插件的源,您将看到这一点。
public class Person {
private LinkedHashSet<String> viewers = null;
public LinkedHashSet<String> getViewers() {
return viewers;
}
public void setViewers(LinkedHashSet<String> viewers) {
this.viewers = viewers;
}
}
Person p = new Person();
LinkedHashSet<String> viewers = new LinkedHashSet<String>();
viewers.add("one");
viewers.add("two");
viewers.add("three");
viewers.add("four");
p.setViewers(viewers);
p.getViewers().remove(p.getViewers().iterator().next());
p.getViewers().remove("two");
p.getViewers().add("two");
for (String s: p.getViewers()){
System.out.println(s);
}