hibernateでの削除に問題があります。私はたくさんの「解決策」を試しましたが、うまくいきませんでした。トーナメント(カンペオナート)を削除せずにチーム(エクイポ)を削除したい
だから、私はこのERを持っています
Equipo --> Equipo_Campeonato <-- Campeonato
id Equipo id
nombre Campeonato nombre
私のエンティティは次のとおりです。
テーブルエクイポ:
@Entity
@Table(name="equipo"
,catalog="sistemafutbol"
)
public class Equipo implements java.io.Serializable {
private Integer id;
private String nombre;
private Set<Campeonato> campeonatos = new HashSet<Campeonato>(0);
@ManyToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY)
@JoinTable(name="equipoxcampeonaato", catalog="sistemafutbol", joinColumns = {
@JoinColumn(name="Equipo", nullable=false, updatable=false) }, inverseJoinColumns = {
@JoinColumn(name="Campeonato", nullable=false, updatable=false) })
public Set<Campeonato> getCampeonatos() {...
タブラカンペオナート
Entity
@Table(name="campeonato"
,catalog="sistemafutbol"
)
public class Campeonato implements java.io.Serializable {
private Integer id;
private String nombre;
private Set<Equipo> equipos = new HashSet<Equipo>(0);
@ManyToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY)
@JoinTable(name="equipoxcampeonaato", catalog="sistemafutbol", joinColumns = {
@JoinColumn(name="Campeonato", nullable=false, updatable=false) }, inverseJoinColumns = {
@JoinColumn(name="Equipo", nullable=false, updatable=false) })
public Set<Equipo> getEquipos() {...
そして、私がやろうとしてきたコードは次のとおりです。
Session session = HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
equipo.getCampeonatos().remove(campeonato);
campeonato.getEquipos().remove(equipo);
session.delete(equipo); // or session.merge(equipo); or session.saveOrUpdate(equipo);
session.getTransaction().commit();
だから私はあなたが私を助けてくれることを願っています。
アップデート
これは、danny.lesnikが私のコードに統合されていると教えてくれるコードです。
Campeonato campeonato = ControladorCampeonato.obtenCampeonato(idCampeonato);
//this is where I get the tournament
if(listaEquiposSeleccionados.length>0){
for(int i=0;i<listaEquiposSeleccionados.length;i++){
int idEquipo = listaEquiposSeleccionados[i].getId().intValue();
Equipo equipo= ControladorEquipo.obtenEquipo(idEquipo);
this is where I get the team.
try{
Session session = HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
campeonato.getEquipos().remove(equipo);
session.update(campeonato);
session.getTransaction().commit();
listaEquiposAgregados.add(equipo);
}
トーナメントを選択し、複数のチームを選択できるWebページを作成しています。私はデバッグしていましたが、例外はsession.update(campeonato);の行にあります。例外は、「コレクションを2つの開いているセッションに関連付ける違法な試み」でした。:S SOLUTION by danny-lesnik
if(listaEquiposSeleccionados.length>0){
for(int i=0;i<listaEquiposSeleccionados.length;i++){
int idEquipo = listaEquiposSeleccionados[i].getId().intValue();
Session session = HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
Equipo equipo= (Equipo)session.load(Equipo.class, idEquipo);
Campeonato campeonato = (Campeonato)session.load(Campeonato.class, idCampeonato);
campeonato.getEquipos().remove(equipo);
session.update(campeonato);
session.getTransaction().commit();
session.close();
}
}
問題は、異なるセッションで「Campeonato」と「Equipo」をロードすることだったと思います。これが同じ問題を抱えている別の人々に役立つことを願っています。