Hibernate加倍结果?

时间:2014-01-09 14:13:25

标签: java hibernate

我对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
}

0 个答案:

没有答案