在线等:懒加载问题,多方是list数组,数组后添加两个对象后,返回的结果中数组顺便竟然不固定,求解。 jpa懒加载多对多数组 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 debug一下:opSpecListId的顺序是否每次都是乱的? 不是,传的值顺序一直是对的,debug完在manager.flush();执行之前,product中的specs顺序是对的 执行之后 specs=null 这个好像是因为懒加载原因吧,再到后面 summarize(product) 顺序就变了 summarize方法是jaxb序列化反序列化操作不影响。感觉问题就在懒加载 添加多方数组 再到数据库是不是无序的现在是传值1 、2 有时候是 1、2 对的 有时候就会2、1 因为是做测试的 测试rest接口,校验所以结果有时对有时不对了,哎 不是,传的值顺序一直是对的,debug完在manager.flush();执行之前,product中的specs顺序是对的 执行之后 specs=null 这个好像是因为懒加载原因吧,再到后面 summarize(product) 顺序就变了 summarize方法是jaxb序列化反序列化操作不影响。感觉问题就在懒加载 添加多方数组 再到数据库是不是无序的现在是传值1 、2 有时候是 1、2 对的 有时候就会2、1 因为是做测试的 测试rest接口,校验所以结果有时对有时不对了,哎 简单描述下:product 和 specs是多对多,现在方法就是上面贴出来的,就是往product.getSpecs()出来的集合添加 两条spec对象、传值就是spec的id然后从数据库中查出来的,多对多默认多方是懒加载,传的两个id再到最后保存到数据库中,id的顺序就会变化,方法中是list集合 add的时候也是按照顺序添加到spec list集合中的,但是最后保存product对象的时候 product中的specs的list中的顺便到数据库就会变化了, 问题就是这个问题目前debug是,调用manager.flush()方法前product中的specs顺序是对的,执行manager.flush()后product中的specs=null 这个应该也是对的,可能是懒加载的原因吧,最后方法结束后,数据库中的specs顺便变了,那就说明保存的product对象中的specs就已经变化了。 问题是不是就出在flush 上 之前是不是都在在内存中的, 但是想不通 不知道原因啊不知道还能明白啥意思,打字快可能有错别字,应该都能看的懂哈 简单描述下:product 和 specs是多对多,现在方法就是上面贴出来的,就是往product.getSpecs()出来的集合添加 两条spec对象、传值就是spec的id然后从数据库中查出来的,多对多默认多方是懒加载,传的两个id再到最后保存到数据库中,id的顺序就会变化,方法中是list集合 add的时候也是按照顺序添加到spec list集合中的,但是最后保存product对象的时候 product中的specs的list中的顺便到数据库就会变化了, 问题就是这个问题目前debug是,调用manager.flush()方法前product中的specs顺序是对的,执行manager.flush()后product中的specs=null 这个应该也是对的,可能是懒加载的原因吧,最后方法结束后,数据库中的specs顺便变了,那就说明保存的product对象中的specs就已经变化了。 问题是不是就出在flush 上 之前是不是都在在内存中的, 但是想不通 不知道原因啊不知道还能明白啥意思,打字快可能有错别字,应该都能看的懂哈 public ProductSummary postConsultProduct( List<String> opSpecListId) { Product product = manager.find(Product.class, new ProductPK(productId)); List<Spec> specs = product.getSpecs(); for (int i = 0; i < opSpecListId.size(); i++) { String id = opSpecListId.get(i); Spec spec = specApi.spec(id); specs.add(spec); } product.setSpecs(specs); product.setState(SpecState.EDITING); logApi.saved(product); manager.flush(); return summarize(product); } 简单的说就是, 传参["spec_001","spec_002"] 调用上面方法后,返回的对象 product.getSpecs 的数组顺序不是传的顺序 调式都有一天了,知道问题在哪 不知道问题原因就是保存一个对象中的list数组 到数据库中数组顺序变化 就这个问题 你的实体类的配置或者注解贴出来,看看你jpa的配置 太多了:Product类: 主要就是这个@JoinTable(joinColumns = {@JoinColumn(name = "PRODUCT_ID", referencedColumnName = "ID"), @JoinColumn(name = "PRODUCT_SNAPSHOTNO", referencedColumnName = "SNAPSHOTNO") }, inverseJoinColumns = { @JoinColumn(name = "SPEC_ID", referencedColumnName = "ID"), @JoinColumn(name = "SPEC_SNAPSHOTNO", referencedColumnName = "SNAPSHOTNO")}) @ManyToMany private List<Spec> specs;persistece.xml <jta-data-source>jdbc/specdb-example-xml</jta-data-source> <exclude-unlisted-classes>false</exclude-unlisted-classes> 请看下这里面是什么啊? 怎么设置WebBrowser的打印表单的宽度? 查询数据库问题 jsp中使用EL的话如何显示 ${str} java文件分卷生成的方法? struts标签<html:reset>无效 问,JavaBean中的xml应如何写? 在线急等!如何在网页上调用本地的计算器 jsp页面中include文件中午字符的显示问题 如何在jsp中用Servlet, java.lang.NullPointerException at org.apache.struts2.ServletActionContex 求一加权平均算法
不是,传的值顺序一直是对的,debug完在manager.flush();执行之前,product中的specs顺序是对的 执行之后 specs=null 这个好像是因为懒加载原因吧,再到后面 summarize(product) 顺序就变了 summarize方法是jaxb序列化反序列化操作不影响。感觉问题就在懒加载 添加多方数组 再到数据库是不是无序的现在是传值1 、2 有时候是 1、2 对的 有时候就会2、1 因为是做测试的 测试rest接口,校验所以结果有时对有时不对了,哎
product 和 specs是多对多,现在方法就是上面贴出来的,就是往product.getSpecs()出来的集合添加 两条spec对象、传值就是spec的id然后从数据库中查出来的,多对多默认多方是懒加载,传的两个id再到最后保存到数据库中,id的顺序就会变化,方法中是list集合 add的时候也是按照顺序添加到spec list集合中的,但是最后保存product对象的时候 product中的specs的list中的顺便到数据库就会变化了, 问题就是这个问题目前debug是,调用manager.flush()方法前product中的specs顺序是对的,执行manager.flush()后product中的specs=null 这个应该也是对的,可能是懒加载的原因吧,最后方法结束后,数据库中的specs顺便变了,那就说明保存的product对象中的specs就已经变化了。 问题是不是就出在flush 上 之前是不是都在在内存中的, 但是想不通 不知道原因啊不知道还能明白啥意思,打字快可能有错别字,应该都能看的懂哈
product 和 specs是多对多,现在方法就是上面贴出来的,就是往product.getSpecs()出来的集合添加 两条spec对象、传值就是spec的id然后从数据库中查出来的,多对多默认多方是懒加载,传的两个id再到最后保存到数据库中,id的顺序就会变化,方法中是list集合 add的时候也是按照顺序添加到spec list集合中的,但是最后保存product对象的时候 product中的specs的list中的顺便到数据库就会变化了, 问题就是这个问题目前debug是,调用manager.flush()方法前product中的specs顺序是对的,执行manager.flush()后product中的specs=null 这个应该也是对的,可能是懒加载的原因吧,最后方法结束后,数据库中的specs顺便变了,那就说明保存的product对象中的specs就已经变化了。 问题是不是就出在flush 上 之前是不是都在在内存中的, 但是想不通 不知道原因啊不知道还能明白啥意思,打字快可能有错别字,应该都能看的懂哈
public ProductSummary postConsultProduct( List<String> opSpecListId) {
Product product = manager.find(Product.class, new ProductPK(productId));
List<Spec> specs = product.getSpecs();
for (int i = 0; i < opSpecListId.size(); i++) {
String id = opSpecListId.get(i);
Spec spec = specApi.spec(id);
specs.add(spec);
}
product.setSpecs(specs);
product.setState(SpecState.EDITING);
logApi.saved(product);
manager.flush();
return summarize(product);
}
简单的说就是, 传参["spec_001","spec_002"] 调用上面方法后,返回的对象 product.getSpecs 的数组顺序不是传的顺序
调式都有一天了,知道问题在哪 不知道问题原因就是保存一个对象中的list数组 到数据库中数组顺序变化 就这个问题
太多了:Product类: 主要就是这个
@JoinTable(joinColumns = {@JoinColumn(name = "PRODUCT_ID", referencedColumnName = "ID"),
@JoinColumn(name = "PRODUCT_SNAPSHOTNO", referencedColumnName = "SNAPSHOTNO")
}, inverseJoinColumns = {
@JoinColumn(name = "SPEC_ID", referencedColumnName = "ID"),
@JoinColumn(name = "SPEC_SNAPSHOTNO", referencedColumnName = "SNAPSHOTNO")})
@ManyToMany
private List<Spec> specs;persistece.xml
<jta-data-source>jdbc/specdb-example-xml</jta-data-source>
<exclude-unlisted-classes>false</exclude-unlisted-classes>