有类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;
/*
creator: Tian Zhichao (chinoistzc@gmail.com)
*
*/
public class Test {
/**
}
[/code]
希望对你有帮助 ....
B类 没有@JoinTable