[英]Why System.out.println() can solving my Hibernate Session?
Hello I'm newbie in learning hibernate framework. 您好,我是学习休眠框架的新手。 I was solved my error but I don't know what the problem happen.
我已经解决了我的错误,但是我不知道发生了什么问题。 In my project I have 2 tables
Tblbarang
and Tbljenis
. 在我的项目中,我有2张桌子
Tblbarang
和Tbljenis
。 And 1 field at Tblbarang
had relations as foreign key by Tbljenis
. 并且
Tblbarang
在Tblbarang
1个字段具有作为外键的Tbljenis
。
I want to update Tblbarang
table. 我想更新
Tblbarang
表。 I had two method 我有两种方法
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);
}
This method to set model combobox which I would choose to set the table Tblbarang
item. 这种设置模型组合框的方法,我会选择设置表
Tblbarang
项。
and now this method to update my Table Tblbarang 现在这个方法来更新我的表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();
when without System.out.print()
the error are following 没有
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)
I will simply my code like this 我将像这样简单地编写我的代码
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();
but the exception showing same error. 但异常显示相同的错误。 I want to know what happen with my code?
我想知道我的代码会怎样? anyone can explain with that issue or this is bug from hibernate, thanks
任何人都可以解释这个问题,或者这是来自休眠的错误,谢谢
In getcombobarang
, you have a sess
(session1) to get objects from database. 在
getcombobarang
,您有一个sess
(session1)从数据库中获取对象。 And when updating tb
, you open another sess
(session2). 当更新
tb
,您打开另一个sess
(session2)。
If Tblbarang
contains a foreign-key object, in this case, which must associates with session1 , because it's obtained from the function getcombobarang
at first. 如果
Tblbarang
包含一个外键的对象,在这种情况下,必须与会话1关联,因为它从功能上获得getcombobarang
在第一。 So sess.update()
throws an exception as you have seen. 因此,如您所见,
sess.update()
引发异常。
For solution: 解决方案:
merge()
instead of update()
merge()
而不是update()
tb
tb
I'm also confused about the impact of System.println()
here. 我也对
System.println()
的影响感到困惑。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.