だから私はこれらのテーブルを持っています:オカレンシアとペルソナ、それらは多対多の関係を持っています。このテーブルは識別と呼ばれます。休止状態を使用しています。
これはオカレンシアのコードです
@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinTable(name = "identificacion", joinColumns = {
@JoinColumn(name = "id_ocurrencia", nullable = false, updatable = false) },
inverseJoinColumns = { @JoinColumn(name = "id_persona",
nullable = false, updatable = false) })
private List<Persona> personas
;
これはペルソナのコードです
// bi-directional many-to-one association to Identificacion
@ManyToMany(fetch = FetchType.LAZY, mappedBy = "persona")
private List<Ocurrencia> ocurrenciasIdentificacion;
Ocurrencia で Fetchtype Lazy を使ってみたのですが、問題があったので EAGER を使いました。ペルソナでも EAGER を使用する必要がありますか? 現時点では、それは私の主な関心事ではありません.ocurrenciaを保存しようとすると問題が発生します. そこで、「人を追加」のようなボタンを持つペルソナの selectonemenu を追加しました。ペルソナを選択して「人を追加」ボタンを押すと、ocurrencia.getPersonas().add(newPersona) に移動します。フォームに正しく表示され(保存を押す前)、以前に記録したオカレンシアを編集すると魅力的に機能しますが、新しいオカレンシアを作成しているときにエラーは発生しませんが、すべてが故障します。データベースに新しいレコードを挿入しません。
ペルソナなしで新しいオカレンシアを追加しようとしたときに頭がおかしくなり、それが機能し、データベースに表示されました。そのため、ocurrencia の主キーがないため、テーブル ID に何も挿入できないと考えました。
これは、テーブルの新しいレコードを作成する GenericDao 関数です。
public void crear(final T o)throws EntidadNoGrabadaException{
try {
em.persist(o);
} catch (final PersistenceException e) {
throw new EntidadNoGrabadaException("Error al grabar: ".concat(o
.toString()), e);
}
}
私が考えることができる唯一の解決策は、識別用のモデル クラスを手動で作成し、オカレンシアとペルソナに多対 1 の関係を作成することです。主キーを追加する必要があると思います。しかし、これは回避策のように思えます。最終的にこれを行う場合、多対多のオプションがあるのはなぜですか。
編集私はちょうどこれを見つけました、
http://www.mkyong.com/hibernate/hibernate-many-to-many-example-join-table-extra-column-annotation/
識別に関する追加の列がありません。これを修正する唯一の方法ですか? ありがとう
アップデート
mappedby="persona" を mappingby="personas" に変更しましたが、このエラーをキャッチしています
23:27:20,334 ERROR [stderr] (http-localhost-127.0.0.1-8080-6) ec.edu.puce.biologia.excepciones.EntidadNoGrabadaException: Error al grabar: ec.edu.puce.biologia.model.Ocurrencia@22231361 persistence error org.hibernate.PersistentObjectException: detached entity passed to persist: ec.edu.puce.biologia.model.Persona
23:27:20,335 ERROR [stderr] (http-localhost-127.0.0.1-8080-6) at ec.edu.puce.biologia.dao.impl.GenericDao.crear(GenericDao.java:68)
23:27:20,335 ERROR [stderr] (http-localhost-127.0.0.1-8080-6) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
23:2