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之间的关系,也就是说实际上成了单向关联

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

首先,你要清楚:在使用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]

希望对你有帮助 ....

B类 没有@JoinTable