【问题标题】:Why System.out.println() can solving my Hibernate Session?为什么 System.out.println() 可以解决我的 Hibernate Session?
【发布时间】:2014-09-28 14:51:57
【问题描述】:

你好我是学习hibernate框架的新手。我解决了我的错误,但我不知道发生了什么问题。在我的项目中,我有 2 个表 TblbarangTbljenisTblbarang 的 1 个字段与 Tbljenis 的关系作为外键。

我想更新Tblbarang 表。我有两种方法

private void getcombobarang() {
    Query q = sess.createQuery("from Tblbarang");
    arrbarang = new ArrayList<>();

    DefaultComboBoxModel comboModel = new DefaultComboBoxModel();

    for (Object o : q.list()) {
        Tblbarang coba = (Tblbarang) o;
        comboModel.addElement(coba.getNamabarang());
        arrbarang.add(coba);
    }
    combobarang.setModel(comboModel);
}

这种设置模型组合框的方法我会选择设置表Tblbarang项。

现在这个方法来更新我的 Table Tblbarang

sess = NewHibernateUtil.getSessionFactory().openSession();
sess.beginTransaction();
Tblbarang tb = new Tblbarang();
tb.setKodbarang(arrbarang.get(combobarang.getSelectedIndex()).getKodbarang());
tb.setNamabarang(arrbarang.get(combobarang.getSelectedIndex()).getNamabarang());
tb.setTbljenis(arrbarang.get(combobarang.getSelectedIndex()).getTbljenis());
tb.setHarganet(arrbarang.get(combobarang.getSelectedIndex()).getHarganet());
tb.setHargajual(arrbarang.get(combobarang.getSelectedIndex()).getHargajual());
System.out.println(arrbarang.get(combobarang.getSelectedIndex()).getTbljenis()); // <-- this line resolved my problem
int st = Integer.parseInt(stok.getText()) ;
int jm = Integer.parseInt(jumlah.getText());
String totss = String.valueOf(st + jm);
Short totstok = Short.parseShort(totss);
tb.setStok(totstok);
sess.update(tb);
sess.getTransaction().commit();

当没有System.out.print() 时,错误如下

org.hibernate.HibernateException: illegally attempted to associate a proxy with two open Sessions
at org.hibernate.proxy.AbstractLazyInitializer.setSession(AbstractLazyInitializer.java:126)
at org.hibernate.proxy.AbstractLazyInitializer.setSession(AbstractLazyInitializer.java:126)
at org.hibernate.engine.StatefulPersistenceContext.reassociateProxy(StatefulPersistenceContext.java:573)
at org.hibernate.engine.StatefulPersistenceContext.reassociateIfUninitializedProxy(StatefulPersistenceContext.java:533)
at org.hibernate.event.def.ProxyVisitor.processEntity(ProxyVisitor.java:50)
at org.hibernate.event.def.AbstractVisitor.processValue(AbstractVisitor.java:125)
at org.hibernate.event.def.AbstractVisitor.processValue(AbstractVisitor.java:83)
at org.hibernate.event.def.AbstractVisitor.processEntityPropertyValues(AbstractVisitor.java:77)
at org.hibernate.event.def.AbstractVisitor.process(AbstractVisitor.java:144)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:314)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:246)
at org.hibernate.event.def.DefaultUpdateEventListener.performSaveOrUpdate(DefaultUpdateEventListener.java:57)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)
at org.hibernate.impl.SessionImpl.fireUpdate(SessionImpl.java:742)
at org.hibernate.impl.SessionImpl.update(SessionImpl.java:730)
at org.hibernate.impl.SessionImpl.update(SessionImpl.java:722)
at retail.ui.frmBarangMasuk.tambahitemActionPerformed(frmBarangMasuk.java:622) //<-this line directing to sess.update(tb)

我将像这样简单地编写我的代码

sess = NewHibernateUtil.getSessionFactory().openSession();
sess.beginTransaction();
Tblbarang tb = (Tblbarang) arrbarang.get(combobarang.getSelectedIndex());
System.out.println(arrbarang.get(combobarang.getSelectedIndex()).getTbljenis());
int st = Integer.parseInt(stok.getText()) ;
int jm = Integer.parseInt(jumlah.getText());
String totss = String.valueOf(st + jm);
Short totstok = Short.parseShort(totss);
tb.setStok(totstok);
sess.update(tb);
sess.getTransaction().commit();

但异常显示相同的错误。我想知道我的代码会发生什么?任何人都可以解释这个问题,或者这是来自休眠的错误,谢谢

【问题讨论】:

  • helo indonesian,同样在这里,给我完整的堆栈跟踪。不要使用等.....
  • 你在哪里可以买到arrbarang?只显示完整的代码可以更好地分析错误,所以显示它
  • 好的,我扩展了错误堆栈跟踪。并且 List arrbarang 是方法 getcombobarang() 的初始化。我使用默认映射和 POJOs 数据库来创建 nbm 实体文件。

标签: java hibernate hibernate-mapping foreign-key-relationship hibernate-session


【解决方案1】:

getcombobarang 中,您有一个sess(session1) 可以从数据库中获取对象。并且在更新tb 时,您会打开另一个sess(session2)。

如果Tblbarang包含一个外键对象,在这种情况下,它必须与session1相关联,因为它首先是从函数getcombobarang获得的。如您所见,sess.update() 抛出异常。

解决办法:

  1. 使用merge() 而不是update()
  2. 更新前,将外键对象的属性复制到一个全新的对象中,然后设置成tb

我也对System.println() 的影响感到困惑。

【讨论】:

  • 我似乎可以用 merge() 方法更新查询?如何复制外键,我的框架中没有对象属性Tbljenis。在我找到魔法System.println() 之前,我想追踪,我不知道它为什么会发生并且我的函数按我想要的方式运行。
  • @jboxxpradhana 不要使用魔法并对此行发表评论 tb.setTbljenis(arrbarang.get(combobarang.getSelectedIndex()).getTbljenis()); 然后再试一次看看会发生什么
  • 我用过那个。查看我的秒格式代码。但是当我删除 System.out.print() 时,我遇到了这些问题。
  • @jboxxpradhana 这很奇怪。 merge() 有效吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-08
  • 1970-01-01
  • 2010-11-24
  • 1970-01-01
相关资源
最近更新 更多