1

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」をロードすることだったと思います。これが同じ問題を抱えている別の人々に役立つことを願っています。

4

1 に答える 1

0

私があなたを正しく理解しているなら、あなたはただ1つの特別なトーナメントから1つの特別なチームを削除したいだけです。あなたの場合、それの間の接続を削除するだけで十分です。

   String equepoId = "xxx"; // 
    String campeonatoId = "yyy";
    Session session = HibernateUtil.getSessionFactory().openSession();
    session.beginTransaction();
    Campeonato campeonato = (Campeonato)session.load(Campeonato.class,campeonatoId);
    Equipo equipo = (Equipo)session.load(Equipo.Class,equapoId);
    campeonato.getEquipos().remove(equipo);
    session.update(campeonato);
    session.getTransaction().commit();
于 2012-05-02T16:13:48.867 に答える