[解決済み] org.hibernate.PersistentObjectException: 永続化するために渡されたデタッチド・エンティティー
質問
私は、hibernateを使用した最初のマスター・チャイルドの例を書くことに成功しました。数日後、私はそれを再び取り、いくつかのライブラリをアップグレードしました。何をしたのか分かりませんが、二度と実行することができません。どなたか、以下のエラーメッセージを返しているコードに問題があることを突き止めるのを手伝っていただけませんか?
org.hibernate.PersistentObjectException: detached entity passed to persist: example.forms.InvoiceItem
at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:127)
at org.hibernate.impl.SessionImpl.firePersist(SessionImpl.java:799)
at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:791)
.... (truncated)
hibernateマッピングを使用します。
<hibernate-mapping package="example.forms">
<class name="Invoice" table="Invoices">
<id name="id" type="long">
<generator class="native" />
</id>
<property name="invDate" type="timestamp" />
<property name="customerId" type="int" />
<set cascade="all" inverse="true" lazy="true" name="items" order-by="id">
<key column="invoiceId" />
<one-to-many class="InvoiceItem" />
</set>
</class>
<class name="InvoiceItem" table="InvoiceItems">
<id column="id" name="itemId" type="long">
<generator class="native" />
</id>
<property name="productId" type="long" />
<property name="packname" type="string" />
<property name="quantity" type="int" />
<property name="price" type="double" />
<many-to-one class="example.forms.Invoice" column="invoiceId" name="invoice" not-null="true" />
</class>
</hibernate-mapping>
EDITです。 InvoiceManager.java
class InvoiceManager {
public Long save(Invoice theInvoice) throws RemoteException {
Session session = HbmUtils.getSessionFactory().getCurrentSession();
Transaction tx = null;
Long id = null;
try {
tx = session.beginTransaction();
session.persist(theInvoice);
tx.commit();
id = theInvoice.getId();
} catch (RuntimeException e) {
if (tx != null)
tx.rollback();
e.printStackTrace();
throw new RemoteException("Invoice could not be saved");
} finally {
if (session.isOpen())
session.close();
}
return id;
}
public Invoice getInvoice(Long cid) throws RemoteException {
Session session = HbmUtils.getSessionFactory().getCurrentSession();
Transaction tx = null;
Invoice theInvoice = null;
try {
tx = session.beginTransaction();
Query q = session
.createQuery(
"from Invoice as invoice " +
"left join fetch invoice.items as invoiceItems " +
"where invoice.id = :id ")
.setReadOnly(true);
q.setParameter("id", cid);
theInvoice = (Invoice) q.uniqueResult();
tx.commit();
} catch (RuntimeException e) {
tx.rollback();
} finally {
if (session.isOpen())
session.close();
}
return theInvoice;
}
}
インボイス.java
public class Invoice implements java.io.Serializable {
private Long id;
private Date invDate;
private int customerId;
private Set<InvoiceItem> items;
public Long getId() {
return id;
}
public Date getInvDate() {
return invDate;
}
public int getCustomerId() {
return customerId;
}
public Set<InvoiceItem> getItems() {
return items;
}
void setId(Long id) {
this.id = id;
}
void setInvDate(Date invDate) {
this.invDate = invDate;
}
void setCustomerId(int customerId) {
this.customerId = customerId;
}
void setItems(Set<InvoiceItem> items) {
this.items = items;
}
}
InvoiceItem.java
public class InvoiceItem implements java.io.Serializable {
private Long itemId;
private long productId;
private String packname;
private int quantity;
private double price;
private Invoice invoice;
public Long getItemId() {
return itemId;
}
public long getProductId() {
return productId;
}
public String getPackname() {
return packname;
}
public int getQuantity() {
return quantity;
}
public double getPrice() {
return price;
}
public Invoice getInvoice() {
return invoice;
}
void setItemId(Long itemId) {
this.itemId = itemId;
}
void setProductId(long productId) {
this.productId = productId;
}
void setPackname(String packname) {
this.packname = packname;
}
void setQuantity(int quantity) {
this.quantity = quantity;
}
void setPrice(double price) {
this.price = price;
}
void setInvoice(Invoice invoice) {
this.invoice = invoice;
}
}
EDITです。 クライアントから送信されたJSONオブジェクト。
{"id":null,"customerId":3,"invDate":"2005-06-07T04:00:00.000Z","items":[
{"itemId":1,"productId":1,"quantity":10,"price":100},
{"itemId":2,"productId":2,"quantity":20,"price":200},
{"itemId":3,"productId":3,"quantity":30,"price":300}]}
EDITです。
一部詳細
以下の2つの方法でインボイスを保存しようとしました。
-
手動で上記の json オブジェクトを作成し、それを新しい のセッションで使用されます。この場合、全く を呼び出す前に、何の活動も行っていない。 save メソッドを実行するため、開いているセッションはないはずです。 saveメソッドで開いたもの以外
-
を使用して既存のデータを読み込みました。 メソッドで取得し、同じ キー値を削除した後のデータ。これも を保存する前にセッションをクローズする必要があります。 トランザクションは、getInvoiceメソッドでコミットされます。
どちらの場合も同じエラーメッセージが表示されるので、ハイバーネート構成ファイル、エンティティクラス、または保存メソッドのいずれかに問題があると考えざるを得ません。
もっと詳しく説明する必要があれば、教えてください。
解決方法は?
関連する詳細があまり書かれていないので、推測するに、あなたは
getInvoice
で、resultオブジェクトを使って値を設定し、その値を元に
save
オブジェクトの変更が保存されることを前提にしています。
しかし
persist
操作は新しいトランジェントオブジェクトを対象としており、id が既に割り当てられている場合は失敗します。あなたの場合、おそらく
saveOrUpdate
ではなく
persist
.
いくつかの議論と参考文献はこちらでご覧いただけます。 JPA/EJBコードでエラー永続化のために渡されたデタッチドエンティティ"。
関連
-
[解決済み] Hibernateはorg.hibernate.AnnotationExceptionをスローします。エンティティに指定された識別子がありません: com..domain.idea.MAE_MFEView
-
[解決済み] PersistentObjectException: JPAとHibernateが投げるpersistに渡されたデタッチド・エンティティー
-
[解決済み] Another エンティティのマッピングでカラムが繰り返されるエラー
-
[解決済み] ConfigurationException: プロジェクトのルート・フォルダに cfg.xml リソース [hibernate.cfg.xml] が見つかりませんでした。
-
[解決済み] Spring HibernateのDataIntegrityViolationExceptionを解決するにはどうすればよいですか?
-
Hibernate Newbie FAQ org.hibernate.service.spi.ServiceException: 要求されたサービスを作成できません
-
問題解決:ロール例外のコレクションを遅延して初期化することに失敗しました。
-
C3P0 (com.mchange.v2.c3p0.ComboPooledDataSource) の詳細設定手順
-
[解決済み] not-nullプロパティは、NULL値または一時的な値を参照します。
-
[解決済み】JPA orphanRemoval=trueとON DELETE CASCADE DML句との相違点
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Hibernateはorg.hibernate.AnnotationExceptionをスローします。エンティティに指定された識別子がありません: com..domain.idea.MAE_MFEView
-
[解決済み】Hibernateの問題 - "マッピングされていないクラスをターゲットにした@OneToManyまたは@ManyToManyの使用"
-
[解決済み】DTOからエンティティへ、エンティティからDTOへ
-
[解決済み] org.hibernate.PersistentObjectException: 永続化するために渡されたデタッチド・エンティティー
-
問題解決:ロール例外のコレクションを遅延して初期化することに失敗しました。
-
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException 解決法
-
[解決済み] Spring MVC + Hibernate: ロードするためのidが必要
-
error:Found shared references to a collection:
-
hibernate exception "Found shared references to a collection" (Reprint)
-
[解決済み】JPA orphanRemoval=trueとON DELETE CASCADE DML句との相違点