我对Hibernate有一个非常奇怪的错误,我无法弄清楚为什么以及何时发生。
有时出于任何原因(我的服务器日志中没有任何例外 - 加上:我无法重现它)如果我使用Hibernate显示分层数据,则较低级别的元素会加倍。 我有一个group-items列表,并将它们的连接行保存在每个group-entity-class的列表中。 组列表工作正常 - 我从未遇到任何问题,但元素列表有时会使其对象加倍。
例如 - 如果我的数据库看起来像:
|agrupID|Name|
------------------
|01 |Good-Selling|
|02 |Weak-Selling|
|ID|agrup_ID_FK|Information|Price|
----------------------
|01| 01|Product A |10.00|
|02| 01|Product B | 7.00|
|03| 02|Product C |50.00|
|04| 02|Product D | 8.50|
休眠输出:
|01 |Good-Selling|
|02 |Weak-Selling|
|01| 01|Product A |10.00|
|01| 01|Product A |10.00|
|02| 01|Product B | 7.00|
|02| 01|Product B | 7.00|
|03| 02|Product C |50.00|
|03| 02|Product C |50.00|
|04| 02|Product D | 8.50|
|04| 02|Product D | 8.50|
用F5实现页面后,错误消失了。
一开始我想也许我在这些情况下运行两次相同的输出但是在完成HTML-Code后我意识到一切都是应该的。好吧,除了双重结果......
原因绝对是Hibernate。在程序的一个部分,它经常发生,所以我决定回到普通的JDBC而不是Hibernate。从那以后它再也没有发生过。
我使用的是JSP,Apache 7 Server,数据库位于SQL-Server 08上.Hibernate是hibernate-core:3.6.10.Final。
我的代码只是我从教程中复制的代码,它在99%的情况下都能正常工作...... 这是我加载包含元素列表的组的方法。每次重新加载页面时我都会再次获取它:
private List<Pricegroup> material;
public void loadAPGroupsHibernate() throws HibernateException {
try {
SessionFactory factory = HibernateUtil.getSessionFactory();
Statistics stats = factory.getStatistics();
stats.setStatisticsEnabled(true);
Session session = factory.openSession();
Transaction tx = session.beginTransaction();
String hql = "SELECT G FROM productGroups.ProductGroup G order by G.agrupID";
Query query = session.createQuery(hql);
material = query.list();
System.out.println("Listsize: " + material.size()); //The size here is fine
tx.commit();
apgruppenhibernateini = true;
} catch (HibernateException hibex) {
System.err.println("Persistenzen, APGruppen: " + hibex);
System.err.println(hibex.getMessage());
hibex.printStackTrace();
}
}
输出似乎也不是很壮观......正如我告诉过你的那样,它通常会起作用。
StringBuilder ret = new StringBuilder();
for (ProductGroup bg : material) {
ret.append("<table><tr>");
ret.append("<td>").append(bg.getName()).append("</td>\n");
ret.append("<table><tr>");
ret.append("<td>Information</td><td>Price</td>");
ret.append("</tr>");
for (productGroups.Prices aps : bg.getPrices()) {
ret.append("<td>").append(aps.getInformation()).append("<td>");
ret.append("<td>").append(aps.getPrice())).append("<td>");
ret.append("</tr>");
}
ret.append("</table>");
}
return ret.toString();
}
实体类也很简单:
@Entity
@Table(name = "[Dbank].[dbo].[Pricegroup]")
public class Pricegroup implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "AGrupID")
private Integer agrupID;
private String name;
@OneToMany(mappedBy = "agrup_ID_FK", fetch = FetchType.LAZY)
private List<Prices> prices;
public Pricegroup() {
}
//Boring Setters and getters
}
较低的实体类......
@Entity
@Table(name = "[Dbank].[dbo].[Prices]")
@org.hibernate.annotations.Entity(dynamicUpdate = true)
public class Prices implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "ID")
private String id;
@Column(updatable = false)
private String information;
@Column(updatable = false)
private Double price;
private String colorcode;
@JoinColumn(name = "agrup_ID_FK", referencedColumnName = "agrupID")
private Integer agrup_ID_FK;
public Arbeitspreise() {
this.colorcode="FFFFFF";
}
//more boring getters and setters
}