自己觉得官方文档写的比较清楚了,所以把官方文档粘下来,并附上自己的运行代码。
在EJB3规范中多对一这端几乎总是双向关联中的主体(owner)端,而一对多这端的关联注解为@OneToMany( mappedBy=... )
@Entity public class Troop { @OneToMany(mappedBy="troop") public Set<Soldier> getSoldiers() { ... } @Entity public class Soldier { @ManyToOne @JoinColumn(name="troop_fk") public Troop getTroop() { ... }
Troop 通过troop 属性和Soldier建立了一对多的双向关联.在mappedBy端不必也不能再定义任何物理映射
对于一对多的双向映射,如果要一对多这一端维护关联关系,你需要删除mappedBy元素并将多对一这端的 @JoinColumn的insertable和updatable设置为false.很明显,这种方案不会得到什么明显的优化,而且还会增加一些附加的UPDATE语句.
@Entity public class Troop { @OneToMany @JoinColumn(name="troop_fk") //we need to duplicate the physical information public Set<Soldier> getSoldiers() { ... } @Entity public class Soldier { @ManyToOne @JoinColumn(name="troop_fk", insertable=false, updatable=false) public Troop getTroop() { ... }
我的代码:
我写的是一个Group 对应多个 User,一个 User 对应一个 Group
User.java
@Entity
@Table(name="t_user")
public class User {
private String name;
private int id;
private Group group;
@ManyToOne
@JoinColumn(name="groupid")
public Group getGroup() {
return group;
}
public void setGroup(Group group) {
this.group = group;
}
@Id
@GeneratedValue
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Group.java
@Entity
@Table(name="t_group")
public class Group {
private Set<User>set=new HashSet<User>();
private String name;
private int id;
@OneToMany(mappedBy="group")
public Set<User> getSet() {
return set;
}
public void setSet(Set<User> set) {
this.set = set;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Id
@GeneratedValue
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}