0

안녕하세요 저는 최대 절전 모드 프레임 워크를 배우는 초보자입니다. 나는 내 실수를 해결했지만 어떤 문제가 발생했는지 모른다. 내 프로젝트에는 2 개의 테이블 TblbarangTbljenis이 있습니다. Tblbarang의 1 필드는 외래 키와 관계가 Tbljenis입니다.왜 System.out.println()은 내 Hibernate 세션을 해결할 수 있습니까?

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 항목을 설정하기 위해 선택할 것 모델 콤보를 설정하는이 방법이 있었다. 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) 

을 다음과 같은 경우 지금

이 방법 내 표 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(); 

를 업데이트 나는 것입니다 단순히이

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(); 

하지만 같은 내 코드 동일한 오류를 나타내는 예외입니다. 내 코드가 어떻게되는지 알고 싶습니까? 누구나 그 문제에 대해 설명 할 수 있습니다. 또는 최대 절전 모드로 인한 버그입니다. 감사합니다.

+0

안녕하세요, indonesian, 여기, 전체 스택 추적을주세요. 등등 ..... – user965347

+0

를 사용하지 말라. 그리고 어디에서 arrbarang를 얻을 수 있냐? 전체 코드를 보여주는 것만으로도 오류를 더 잘 분석 할 수 있습니다. 따라서 – user965347

+0

을 표시하십시오. 오류 스택 트레이스를 확장했습니다. List arrbarang은 getcombobarang() 메소드에서 초기화됩니다. 기본 매핑과 POJO 데이터베이스를 사용하여 nbm 엔티티 파일을 만듭니다. – jboxxpradhana

답변

0

getcombobarang에는 데이터베이스에서 개체를 가져 오는 sess (세션 1)이 있습니다. 그리고 tb을 업데이트 할 때 다른 sess (session2)을 엽니 다. 이 우선 함수 getcombobarang로부터 얻어지는 것 때문에

Tblbarang 경우,이 경우에는 외래 키 오브젝트, session1와 반드시 동료를 포함한다. 따라서 sess.update()은 본 것처럼 예외를 throw합니다. 솔루션

:

  1. 사용 merge() 대신 갱신 전에
  2. update()의, 완전히 새로운 개체에 외래 키 객체의 속성을 복사 후 tb 나 '

로 설정 또한 여기에 System.println()의 영향에 대해 혼란스러워합니다.

+0

내가 할 수있는 병합() 메서드를 사용하여 업데이트 쿼리를 보인다? 어떻게 외부 키를 복사 할 수 있습니까, 내 프레임에 객체 속성 'Tbljenis'이 없습니다. 전에 내가 추적하려는 마법의'System.println()'을 발견하기 전에 왜 그런 일이 일어나고 내 기능은 원하는대로 실행되는지 모르겠다. – jboxxpradhana

+0

@jboxxpradhana 마법을 사용하지 말고이 줄에 주석을 추가하십시오. tb.setTbljenis (arrbarang.get (combobarang.getSelectedIndex()). getTbljenis()); 그러면 무슨 일이 일어나는지 다시 한번 확인하십시오. – Jiang

+0

나는 이것을 사용하고있었습니다. 내 초 형식 코드를 참조하십시오. 하지만 System.out.print()를 제거하면 이러한 문제가 발생합니다. – jboxxpradhana