既存のデタッチされたエンティティをManyToOneリレーションに設定する際に問題が発生しました。Hibernateは次のようにPersistentObjectException
言います:'デタッチされたエンティティがpersistに渡されました:model.persons.Customer'。
私のユースケースは次のとおりです。
JSF2ビューを開いて、NamedBeanとステートレスOrderDAOEJBの呼び出しを介して注文を作成できます。そのビューで、ドロップダウンリストから顧客を選択できます。ドロップダウンリストは、データベースから顧客のリストをフェッチする別のステートレスCustomerDAOEJJを使用して入力されます。顧客を選択すると、顧客は注文に設定されます。ステートレスOrderDAOEJJを使用して注文を保存すると、上記の例外がスローされます。
私のエンティティは次のようになります。
@Entity
public class Order extends AbstractEntity implements Serializable {
private static final long serialVersionUID = -8061887078955032972L;
@ManyToOne(cascade={CascadeType.MERGE, CascadeType.REFRESH, CascadeType.PERSIST}, optional = false)
private Customer customer = null;
...
}
@Entity
@DiscriminatorValue("customer")
public class Customer extends Person implements Serializable {
private static final long serialVersionUID = 2788107135840578322L;
@OneToMany(cascade=CascadeType.ALL, mappedBy="customer")
private List<Order> orders = null;
...
}
また、関連するコードは次のようになります。
@Named
@ConversationScoped
public class OrderController implements Serializable {
private static final long serialVersionUID = -4868506512979135651L;
@EJB
private OrderEJB orderBean;
private Order order;
...
public Order getOrder() {
if (order == null) {
if (id == null) {
order = orderBean.create();
} else {
order = orderBean.findById(id);
}
}
return order;
}
public String saveOrder() {
order = orderBean.save(order);
return "savedOrder";
}
}
@Stateless
public class OrderEJB extends GenericDAO<Order> {
}
public class GenericDAO<T extends AbstractEntity> {
public T create() {
try {
return getClassType().newInstance();
} catch (Exception e) {
logger.log(Level.SEVERE, "Error creating new instance of "+getClassType(), e);
}
return null;
}
public T save(T entity) {
if (entity.getId() == null) {
saveNew(entity);
} else {
entity = update(entity);
}
return entity;
}
private void saveNew(T entity) {
em.persist(entity);
}
private T update(T entity) {
return em.merge(entity);
}
}
注文用と顧客用の2つの異なるEJBを使用しているという事実は問題ですか?