1

在庫管理システムを作成しようとしています。しかし今、いくつか質問があります。これらの問題を整理するのを手伝ってください。

私は2つのエンティティを持っています。ItemItemPrice1つ以上Item持っています ItemPrice

Itemオブジェクトを保存しようとすると、正常に動作します。しかし、データベースから詳細を取得しようとすると、次のExceptionスタック トレースが表示されます。

org.hibernate.HibernateException: コレクションへの共有参照が見つかりました: com.pos.entities.ItemGroup.items
Hibernate: itemmodel0_.id を id9_、itemmodel0_.item_model を item2_9_、itemmodel0_.status を status9_ として smartpos.item_model itemmodel0_ から選択 (itemmodel0_.status=? )
Hibernate: smartpos.item_size から itemsize0_.id を id3_ として、itemsize0_.item_size を item2_3_ として、itemsize0_.status を status3_ として選択します。
    org.hibernate.engine.Collections.processReachableCollection(Collections.java:163) で
    org.hibernate.event.def.FlushVisitor.processCollection (FlushVisitor.java:37) で
    org.hibernate.event.def.AbstractVisitor.processValue (AbstractVisitor.java:101) で
    org.hibernate.event.def.AbstractVisitor.processValue (AbstractVisitor.java:61) で
    org.hibernate.event.def.AbstractVisitor.processEntityPropertyValues (AbstractVisitor.java:55) で
    org.hibernate.event.def.DefaultFlushEntityEventListener.onFlushEntity (DefaultFlushEntityEventListener.java:138) で
    org.hibernate.event.def.AbstractFlushingEventListener.flushEntities (AbstractFlushingEventListener.java:196) で
    org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions (AbstractFlushingEventListener.java:76) で
    org.hibernate.event.def.DefaultFlushEventListener.onFlush (DefaultFlushEventListener.java:26) で
    org.hibernate.impl.SessionImpl.flush (SessionImpl.java:1000) で
    org.hibernate.impl.SessionImpl.managedFlush (SessionImpl.java:338) で
    org.hibernate.transaction.JDBCTransaction.commit (JDBCTransaction.java:106) で
    com.pos.dao.ItemDaoImpl.getItem(ItemDaoImpl.java:761) で
    com.pos.manager.ItemManager.getItem(ItemManager.java:296) で
    com.pos.ui.ItemDefinitionForm$RefreshTask.doInBackground (ItemDefinitionForm.java:464) で
    com.pos.ui.ItemDefinitionForm$RefreshTask.doInBackground (ItemDefinitionForm.java:458) で
    javax.swing.SwingWorker$1.call(SwingWorker.java:277) で
    java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) で
    java.util.concurrent.FutureTask.run (FutureTask.java:138) で
    javax.swing.SwingWorker.run(SwingWorker.java:316)で
    java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) で
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) で
    java.lang.Thread.run(Thread.java:619) で
2012 年 11 月 7 日 12:03:42 PM org.hibernate.LazyInitializationException
SEVERE: ロールのコレクションの遅延初期化に失敗しました: com.pos.entities.Item.itemPrices、セッションまたはセッションが閉じられませんでした
org.hibernate.LazyInitializationException: ロールのコレクションの遅延初期化に失敗しました: com.pos.entities.Item.itemPrices、セッションまたはセッションが閉じられませんでした
    org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException (AbstractPersistentCollection.java:358) で
    org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected (AbstractPersistentCollection.java:350) で
    org.hibernate.collection.AbstractPersistentCollection.readSize (AbstractPersistentCollection.java:97) で
    org.hibernate.collection.PersistentSet.size (PersistentSet.java:139) で
    com.pos.ui.ItemDefinitionForm$RefreshTask.doInBackground(ItemDefinitionForm.java:520) で
    com.pos.ui.ItemDefinitionForm$RefreshTask.doInBackground (ItemDefinitionForm.java:458) で
    javax.swing.SwingWorker$1.call(SwingWorker.java:277) で
    java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) で
    java.util.concurrent.FutureTask.run (FutureTask.java:138) で
    javax.swing.SwingWorker.run(SwingWorker.java:316)で
    java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) で
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) で
    java.lang.Thread.run(Thread.java:619) で
org.hibernate.LazyInitializationException: ロールのコレクションの遅延初期化に失敗しました: com.pos.entities.Item.itemPrices、セッションまたはセッションが閉じられませんでした
    org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException (AbstractPersistentCollection.java:358) で
    org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected (AbstractPersistentCollection.java:350) で
    org.hibernate.collection.AbstractPersistentCollection.readSize (AbstractPersistentCollection.java:97) で
    org.hibernate.collection.PersistentSet.size (PersistentSet.java:139) で
    com.pos.ui.ItemDefinitionForm$RefreshTask.doInBackground(ItemDefinitionForm.java:520) で
    com.pos.ui.ItemDefinitionForm$RefreshTask.doInBackground (ItemDefinitionForm.java:458) で
    javax.swing.SwingWorker$1.call(SwingWorker.java:277) で
    java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) で
    java.util.concurrent.FutureTask.run (FutureTask.java:138) で
    javax.swing.SwingWorker.run(SwingWorker.java:316)で
    java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) で
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) で
    java.lang.Thread.run(Thread.java:619) で

これはエンティティ クラス ファイルです。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"   "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated Nov 3, 2012 10:36:51 PM by Hibernate Tools 3.2.1.GA -->
<hibernate-mapping>
<class catalog="smartpos" name="com.pos.entities.ItemPrice" table="item_price" lazy="false">
<id name="id" type="java.lang.Integer">
  <column name="id"/>
  <generator class="identity"/>
</id>
<many-to-one class="com.pos.entities.Item" fetch="select" name="item">
  <column name="item_id" not-null="true"/>
</many-to-one>
<many-to-one class="com.pos.entities.PriceList" fetch="select" name="priceList">
  <column name="price_list_id" not-null="true"/>
</many-to-one>
<property name="price" type="float">
  <column name="price" not-null="true" precision="12" scale="0"/>
</property>

品目エンティティ

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated Nov 3, 2012 10:36:51 PM by Hibernate Tools 3.2.1.GA -->
<hibernate-mapping>
<class catalog="smartpos" lazy="false" name="com.pos.entities.Item" table="item">
<id name="id" type="java.lang.Integer">
  <column name="id"/>
  <generator class="identity"/>
</id>
<many-to-one class="com.pos.entities.ItemColor" fetch="select" name="itemColor">
  <column name="item_color_id" not-null="true"/>
</many-to-one>
<many-to-one class="com.pos.entities.ItemModel" fetch="select" name="itemModel">
  <column name="item_model_id" not-null="true"/>
</many-to-one>
<many-to-one class="com.pos.entities.ItemGrade" fetch="select" name="itemGrade">
  <column name="item_grade_id" not-null="true"/>
</many-to-one>
<many-to-one class="com.pos.entities.BusinessPartner" fetch="select" name="businessPartner">
  <column name="supplier_id" not-null="true"/>
</many-to-one>
<many-to-one class="com.pos.entities.ItemSize" fetch="select" name="itemSize">
  <column name="item_size_id" not-null="true"/>
</many-to-one>
<many-to-one class="com.pos.entities.Login" fetch="select" name="login">
  <column name="login_id" not-null="true"/>
</many-to-one>
<many-to-one class="com.pos.entities.ItemGroup" fetch="select" name="itemGroup">
  <column name="item_group_id" not-null="true"/>
</many-to-one>
<many-to-one class="com.pos.entities.ItemBrand" fetch="select" name="itemBrand">
  <column name="item_brand_id" not-null="true"/>
</many-to-one>
<property name="itemCode" type="string">
  <column length="50" name="item_code" not-null="true" unique="true"/>
</property>
<property name="itemName" type="string">
  <column length="200" name="item_name" not-null="true"/>
</property>
<property name="shortName" type="string">
  <column length="100" name="short_name" not-null="true"/>
</property>
<property name="barcode" type="string">
  <column length="50" name="barcode" not-null="true"/>
</property>
<property name="warrentyItem" type="byte">
  <column name="warrenty_item" not-null="true"/>
</property>
<property name="taxableItem" type="byte">
  <column name="taxable_item" not-null="true"/>
</property>
<property name="status" type="byte">
  <column name="status" not-null="true"/>
</property>
<property name="createdDate" type="timestamp">
  <column length="19" name="created_date" not-null="true"/>
</property>
<property name="batchSerial" type="byte">
  <column name="batch_serial" not-null="true"/>
</property>
<property name="warrentyPeriod" type="int">
  <column name="warrenty_period" not-null="true"/>
</property>
<set inverse="true" name="itemPrices" cascade="save-update">
  <key>
    <column name="item_id" not-null="true"/>
  </key>
  <one-to-many class="com.pos.entities.ItemPrice"/>
</set>

GUI コーディング

headers = new SupportedMethod().getTableHeaderValues(tblItemPrice);
System.out.println("sdff" + item.getItemPrices().size());
itemPriceSet = item.getItemPrices();
Iterator it = itemPriceSet.iterator();

while (it.hasNext()) {
    ItemPrice ip = (ItemPrice) it.next();
    Vector<Object> oneRow = new Vector<Object>();

    oneRow.add(ip.getId());
    oneRow.add(ip.getPriceList().getPriceListName());
    oneRow.add(Float.toString(ip.getPrice()));

    tableData.add(oneRow);
}
tblItemPrice.setModel(new DefaultTableModel(tableData, headers));

cascadeは OK で、既に を設定していますlazy=falseが、 がスローされExceptionます。誰か助けてください。

4

3 に答える 3

4

スタックトレースからのこれらの行は、 Item.itemPrices セットが遅延初期化を使用していることを示しています。

collection of role: com.pos.entities.Item.itemPrices, no session or session was closed at
org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:358)
...

そのため、lazy="false" を itemPrices コレクションに追加してください:

<set inverse="true" name="itemPrices" lazy="false" fetch="select" cascade="save-update">
  <key>
    <column name="item_id" not-null="true"/>
  </key>
  <one-to-many class="com.pos.entities.ItemPrice"/>
</set>
于 2012-11-07T07:48:56.170 に答える
2

lazy=false は、これを行うための専門的な方法ではありません。構成でそれを行うと、アクセスするたびに遅延読み込みが使用されないことを意味します。遅延読み込みは良いことです。問題の解決策は、その特定のトランザクション メソッドで 1 つのメソッド「size()」を呼び出すだけです。itemmrice コレクションの size() メソッドを呼び出すだけです。コレクションを初期化し、セッションを閉じます。したがって、すべてのデータが取得されます。

于 2012-11-08T06:18:33.987 に答える
1

hoazは正しいです。遅延読み込みが設定されている場合、コレクションはアクセスされるまで読み込まれません。そして、私の推測では、アプリケーションがそれにアクセスしようとすると、そのオブジェクトに関連付けられている特定のセッションがすでに閉じられています。

遅延読み込みを完全に無効にしている場合、スタックトレースの遅延読み込みに失敗した部分を取得することはできません。

新しいスタックトレースを投稿してください。

于 2012-11-08T05:47:55.417 に答える