0

こんにちは、休止状態フレームワークの学習初心者です。エラーは解決しましたが、何が問題なのかわかりません。私のプロジェクトでは、2 つのテーブルTblbarangTbljenis. そして の 1 つのフィールドはTblbarangによって外部キーとして関係がありましたTbljenis

Tblbarangテーブルを更新したい。私は2つの方法を持っていました

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テーブルアイテムを設定するために選択するモデルコンボボックスを設定するこのメソッド。

そして今、私のテーブル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();

しかし、同じエラーを示す例外。私のコードで何が起こるか知りたいですか? 誰でもその問題を説明できるか、これは休止状態のバグです、ありがとう

4

1 に答える 1

0

ではgetcombobarangsessデータベースからオブジェクトを取得するための (session1) があります。を更新するときは、別のセッション (session2)tbを開きます。sess

Ifに外部キー オブジェクトが含まれている場合 (この場合は、最初に関数から取得されるため、 session1Tblbarangに関連付ける必要があります)。あなたが見たように例外をスローします。getcombobarangsess.update()

解決策:

  1. merge()の代わりに使用update()
  2. 更新する前に、外部キー オブジェクトのプロパティをまったく新しいオブジェクトにコピーしてから、tb

ここの影響についても混乱していSystem.println()ます。

于 2014-09-28T16:19:07.717 に答える