Я успешно написал свой первый главный дочерний пример с помощью спящего режима. Через несколько дней я снова взял его и обновил некоторые библиотеки. Не уверен, что я сделал, но я никогда не мог заставить его работать снова. Может ли кто-нибудь помочь мне выяснить, что не так в коде, который возвращает следующее сообщение об ошибке:
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-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>
РЕДАКТИРОВАТЬ: 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;
}
}
Invoice.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;
}
}
РЕДАКТИРОВАТЬ: Объект 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}]}
РЕДАКТИРОВАТЬ: Некоторые сведения:
Я попытался сохранить счет двумя способами:
Изготовлено вручную вышеупомянутым json и передал его в свежий сессия сервера. В этом случае абсолютно до звонка не производилось никаких действий сохранить метод, поэтому не должно быть открытого сеанса кроме одного, открытого в методе сохранения
. Загружены существующие данные с помощью getInvoice, и они прошли то же самое данные после удаления значения ключа. Я тоже в это верю следует закрыть сеанс перед сохранением как транзакция фиксируется в методе getInvoice.
В обоих случаях я получаю одно и то же сообщение об ошибке, которое заставляет меня думать, что что-то не так с файлом конфигурации спящего режима, классами сущностей или методом сохранения.
Пожалуйста, дайте мне знать, если я должен предоставить более подробную информацию
Два решения 1. используйте слияние, если Вы хотите обновить объект 2. используйте сохраняют, если Вы хотите просто сохранить новый объект (удостоверьтесь, что идентификационные данные являются пустыми для разрешения, в спящем режиме, или база данных генерируют его), 3. при использовании отображения как
@OneToOne (выберите = FetchType. НЕТЕРПЕЛИВЫЙ, cascade=CascadeType. ВСЕ) @JoinColumn (называют = "stock_id")
Затем использование CascadeType. ВСЕ к CascadeType. СЛИЯНИЕ
спасибо Шахид Abbasi