d111x 2010-04-07 10:32
浏览 197
已采纳

Hibernate 注解 多对多双向关联失败 的问题求解

有类A与类B多对多映射,
类A代码

[code="java"]
@Entity
@Table(name="a")
public class A {
@Id
@GeneratedValue
private Integer id;
private String name;

 public Integer getId() {
     return id;
 }

 public void setId(Integer id) {
     this.id = id;
 }

 @ManyToMany(cascade={CascadeType.MERGE,CascadeType.PERSIST}
 )
 @JoinTable(name="a_b",
            joinColumns={@JoinColumn(name="a_id")},
            inverseJoinColumns={@JoinColumn(name="b_id")}
 )
 private List<B> bs;

 public List<B> getBs() {
     return bs;
 }

 public void setBs(List<B> bs) {
     this.bs = bs;
 }

 public String getName() {
     return name;
 }

 public void setName(String name) {
     this.name = name;
 }

}[/code]
类B代码

[code="java"] @Entity
@Table(name = "b")
public class B {
@Id
@GeneratedValue
private Integer id;
private String name;

 @ManyToMany(cascade = { CascadeType.PERSIST, CascadeType.MERGE }, mappedBy = "bs", targetEntity = A.class)
 private List<A> as;

 public Integer getId() {
     return id;
 }

 public void setId(Integer id) {
     this.id = id;
 }

 public List<A> getAs() {
     return as;
 }

 public void setAs(List<A> as) {
     this.as = as;
 }

 public String getName() {
     return name;
 }

 public void setName(String name) {
     this.name = name;
 }

}[/code]

现在的问题是:
可以通过
a.setBs(bs);
session.save(a);
来保存与b与a之间关系,

但不能通过
b.setAs(as);
session.save(b);
来保存b与a之间的关系,也就是说实际上成了单向关联

我好像找到问题所在了,是因为我先保存再

  • 写回答

2条回答 默认 最新

  • iteye_13460 2010-04-07 22:57
    关注

    首先,你要清楚:在使用mappedBy后....,就成单向的了.也就是mappedBy出现的位置所在的类,这个类是被维护端,它只能被别人级联,不能去保存别人.

    其次,在一对多,多对一,多对多中,要使用Set,最好不用使用List.

    最后,下面是经测试在Oracle通过的代码.

    [code="java"]package com;

    import java.util.HashSet;
    import java.util.Set;

    import javax.persistence.CascadeType;
    import javax.persistence.Entity;
    import javax.persistence.Id;
    import javax.persistence.JoinColumn;
    import javax.persistence.JoinTable;
    import javax.persistence.ManyToMany;
    import javax.persistence.Table;

    /**

    • @author ChinoisTzc
      *
      */
      @Entity
      @Table(name="a")
      public class A {
      @Id
      private Integer id;
      private String name;

      public Integer getId() {
      return id;
      }

      public void setId(Integer id) {
      this.id = id;
      }

      @ManyToMany(cascade = CascadeType.ALL)
      @JoinTable(name="a_b",
      joinColumns={@JoinColumn(name="a_id")},
      inverseJoinColumns={@JoinColumn(name="b_id")}
      )
      private Set bs = new HashSet();

      public Set getBs() {
      return bs;
      }

      public void setBs(Set bs) {
      this.bs = bs;
      }

      public String getName() {
      return name;
      }

      public void setName(String name) {
      this.name = name;
      }

      }[/code]

    [code="java"]package com;

    import java.util.HashSet;
    import java.util.Set;

    import javax.persistence.CascadeType;
    import javax.persistence.Entity;
    import javax.persistence.Id;
    import javax.persistence.JoinColumn;
    import javax.persistence.JoinTable;
    import javax.persistence.ManyToMany;
    import javax.persistence.Table;

    @Entity
    @Table(name = "b")
    public class B {
    @Id
    private Integer id;
    private String name;

     @ManyToMany(cascade = CascadeType.ALL)
     @JoinTable(name="a_b",joinColumns=@JoinColumn(name="a_id"),inverseJoinColumns=@JoinColumn(name="b_id"))
     private Set<A> as = new HashSet<A>();
    
     public Integer getId() {
         return id;
     }
    
     public void setId(Integer id) {
         this.id = id;
     }
    
    
     public Set<A> getAs() {
        return as;
    }
    
    public void setAs(Set<A> as) {
        this.as = as;
    }
    
    public String getName() {
         return name;
     }
    
     public void setName(String name) {
         this.name = name;
     }
    

    }[/code]

    [code="java"]package com;

    import java.util.HashSet;
    import java.util.Set;

    import org.hibernate.Session;

    /*

    }
    [/code]

    希望对你有帮助 ....

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥50 永磁型步进电机PID算法
  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥200 uniapp长期运行卡死问题解决
  • ¥15 latex怎么处理论文引理引用参考文献
  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?