1

我在使用休眠删除时遇到问题。我尝试了很多“解决方案”,但都没有奏效。我想在不删除比赛 (campeonato) 的情况下删除球队 (equipo)

所以,我有这个 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() {...

Tabla Campeonato

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);
            }

我正在做一个网页,我可以在其中选择一场比赛,我可以选择多支球队。我正在调试,异常就在 session.update(campeonato); 行中。例外是“非法尝试将集合与两个打开的会话相关联”。:S 解决方案由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

如果我理解正确,您只想从一场特殊比赛中删除一支特殊球队。在您的情况下,删除它之间的连接就足够了。

   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 回答