1.两张表多对多映射---(user表,service表)----生成中间表(user_service)-(userId,serviceId,value)---value不在两个表中,所以这一点很难设计
user表:
/*
* <!--服务器端存放所有客户信息(hostname,ip)-->
*/
@SuppressWarnings("serial")
@Entity
@Table(name = "user")
public class CenterUser implements Serializable {
private int userId;
private String name;
private String ip;
<span style="color:#FF0000;">private List<CenterUser_Service> services=new ArrayList<CenterUser_Service>();// 不同用户对统一服务的信任度不同--存儲在user-service表
</span>
public CenterUser() {
super();
// TODO Auto-generated constructor stub
}
public CenterUser(String name, String ip) {
super();
this.name = name;
this.ip = ip;
}
@Id
@GeneratedValue
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
@Column(unique = true, length = 10, nullable = false)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Column(nullable = false)
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
<span style="color:#FF0000;">@OneToMany(mappedBy="user",cascade=CascadeType.ALL,fetch=FetchType.LAZY,targetEntity=CenterUser_Service.class)</span>
public List<CenterUser_Service> getServices() {
return services;
}
public void setServices(List<CenterUser_Service> services) {
this.services = services;
}
@Transient
public List<CenterService> getServiceByValue() {
Collections.sort(this.services, new Comparator<CenterUser_Service>() {
public int compare(CenterUser_Service o1, CenterUser_Service o2) {
return o1.getValue().compareTo(o2.getValue());
}
});
List<CenterService> sList = new ArrayList();
for(CenterUser_Service userAndservice: this.services)
sList.add(userAndservice.getService());
return sList;
}
public void addService(CenterService service) {
CenterUser_Service user_service = new CenterUser_Service();
user_service.addService(this, service, getServices().size());
getServices().add(user_service);
}
}
service表:
@SuppressWarnings("serial")
@Entity
@Table(name = "service")
public class CenterService implements Serializable {
private int serviceId;// 标志符
private String name;
private CenterServiceHost host;
<span style="color:#FF0000;">private List<CenterUser_Service> users=new ArrayList<CenterUser_Service>();</span>
public CenterService() {
super();
// TODO Auto-generated constructor stub
}
public CenterService(String name, CenterServiceHost host, List<CenterUser_Service> users) {
super();
this.name = name;
this.host = host;
this.users = users;
}
@Id
@GeneratedValue
public int getServiceId() {
return serviceId;
}
public void setServiceId(int id) {
this.serviceId = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@ManyToOne(cascade={CascadeType.MERGE,CascadeType.REFRESH,},fetch=FetchType.EAGER)
@JoinColumn(name="hostId")
public CenterServiceHost getHost() {
return host;
}
public void setHost(CenterServiceHost host) {
this.host = host;
}
<span style="color:#FF0000;">@OneToMany(mappedBy="service",cascade=CascadeType.ALL,fetch=FetchType.LAZY,targetEntity=CenterUser_Service.class)
public List<CenterUser_Service> getUsers() {
return users;
}
</span>
public void setUsers(List<CenterUser_Service> users) {
this.users = users;
}
}
user_service表:主键(userId,serviceId)@Entity
@Table(name = "user_service")
public class CenterUser_Service implements Serializable {
<span style="color:#FF0000;">private CenterUser_ServiceId usId;</span>
private CenterUser user;
private CenterService service;
<span style="color:#FF0000;">private Integer value;</span>
@EmbeddedId
public CenterUser_ServiceId getUsId() {
return usId;
}
public void setUsId(CenterUser_ServiceId usId) {
this.usId = usId;
}
<span style="color:#FF0000;">@ManyToOne(cascade=CascadeType.REFRESH,fetch=FetchType.EAGER)
@JoinColumn(name="userId",referencedColumnName="userId",insertable=false,updatable=false)</span>
public CenterUser getUser() {
return user;
}
public void setUser(CenterUser user) {
this.user = user;
}
<span style="color:#FF0000;">@ManyToOne(cascade=CascadeType.REFRESH,fetch=FetchType.EAGER)
@JoinColumn(name="serviceId",referencedColumnName="serviceId",insertable=false,updatable=false)</span>
public CenterService getService() {
return service;
}
public void setService(CenterService service) {
this.service = service;
}
public Integer getValue() {
return value;
}
public void setValue(Integer value) {
this.value = value;
}
public void addService(CenterUser user, CenterService service, Integer value) {
this.user = user;
this.service = service;
this.value = value;
setUsId(new CenterUser_ServiceId(user.getUserId(), service.getServiceId()));
}
<span style="color:#FF0000;">@Embeddable
public static class CenterUser_ServiceId implements Serializable{</span>
private Integer userId;
private Integer serviceId;
public CenterUser_ServiceId() {
super();
// TODO Auto-generated constructor stub
}
public CenterUser_ServiceId(Integer userId, Integer serviceId) {
super();
this.userId = userId;
this.serviceId = serviceId;
}
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public Integer getServiceId() {
return serviceId;
}
public void setServiceId(Integer serviceId) {
this.serviceId = serviceId;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result
+ ((serviceId == null) ? 0 : serviceId.hashCode());
result = prime * result
+ ((userId == null) ? 0 : userId.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
CenterUser_ServiceId other = (CenterUser_ServiceId) obj;
if (serviceId == null) {
if (other.serviceId != null)
return false;
} else if (!serviceId.equals(other.serviceId))
return false;
if (userId == null) {
if (other.userId != null)
return false;
} else if (!userId.equals(other.userId))
return false;
return true;
}
}
}
外文链接:http://stackoverflow.com/questions/2098247/hibernate-many-to-many-with-map-collection
2.两张表多对多映射---(user表,service表)----生成中间表(user_service)-(userId,serviceId)---两个字段都在两个表中
空
3.单表多对多映射--user表----生成中间表(user_user)-(parentUserId,childUserId,value)----value字段不在这个表中
user表:
@SuppressWarnings("serial")
@Entity
@Table(name = "user")
public class CenterUser implements Serializable {
private int userId;
private String name;
private String ip;
<span style="color:#FF0000;">private List<CenterUser_User> parentUsers;//有交互的父user
private List<CenterUser_User> childUsers;//有交互的子user</span>
public CenterUser() {
super();
// TODO Auto-generated constructor stub
}
public CenterUser(String name, String ip) {
super();
this.name = name;
this.ip = ip;
}
@Id
@GeneratedValue
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
@Column(unique = true, length = 10, nullable = false)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Column(nullable = false)
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
<span style="color:#FF0000;">@OneToMany(mappedBy="childUser",cascade=CascadeType.ALL,fetch=FetchType.LAZY,targetEntity=CenterUser_User.class)
public List<CenterUser_User> getChildUsers() {</span>
return childUsers;
}
public void setChildUsers(List<CenterUser_User> childUsers) {
this.childUsers = childUsers;
}
<span style="color:#FF0000;">@OneToMany(mappedBy="parentUser",cascade=CascadeType.ALL,fetch=FetchType.LAZY,targetEntity=CenterUser_User.class)
public List<CenterUser_User> getParentUsers() {</span>
return parentUsers;
}
public void setParentUsers(List<CenterUser_User> parentUsers) {
this.parentUsers = parentUsers;
}
@Transient
public List<CenterUser> getChildUserByValue() {
Collections.sort(this.childUsers, new Comparator<CenterUser_User>() {
public int compare(CenterUser_User o1, CenterUser_User o2) {
return o1.getValue().compareTo(o2.getValue());
}
});
List<CenterUser> sList = new ArrayList();
for(CenterUser_User userAnduser: this.childUsers)
sList.add(userAnduser.getChildUser());
return sList;
}
public void addChildUser(CenterUser childuser) {
CenterUser_User user_user = new CenterUser_User();
user_user.addChildUser(this, childuser, getChildUsers().size());
getChildUsers().add(user_user);
}
}
user_user表:主键(parentUserId,childUserId)
@Entity
@Table(name="user_user")
public class CenterUser_User {
private CenterUser_UserId uuid;
private CenterUser parentUser;
private CenterUser childUser;
<span style="color:#FF0000;">private Integer value;</span>
@EmbeddedId
@Column(name="uuid")
public CenterUser_UserId getUuid() {
return uuid;
}
public void setUuid(CenterUser_UserId uuid) {
this.uuid = uuid;
}
<span style="color:#FF0000;">@ManyToOne(cascade=CascadeType.REFRESH,fetch=FetchType.EAGER)
@JoinColumn(name="parentUserId",referencedColumnName="userId",insertable=false,updatable=false)
public CenterUser getParentUser() {</span>
return parentUser;
}
public void setParentUser(CenterUser parentUser) {
this.parentUser = parentUser;
}
<span style="color:#FF0000;">@ManyToOne(cascade=CascadeType.REFRESH,fetch=FetchType.EAGER)
@JoinColumn(name="childUserId",referencedColumnName="userId",insertable=false,updatable=false)</span>
public CenterUser getChildUser() {
return childUser;
}
public void setChildUser(CenterUser childUser) {
this.childUser = childUser;
}
public Integer getValue() {
return value;
}
public void setValue(Integer value) {
this.value = value;
}
public void addChildUser(CenterUser parentuser, CenterUser childuser, Integer value) {
this.parentUser = parentuser;
this.childUser = childuser;
this.value = value;
setUuid(new CenterUser_UserId(parentuser.getUserId(), childuser.getUserId()));
}
@Embeddable
public static class CenterUser_UserId implements Serializable{
private Integer parentUserId;
private Integer childUserId;
public CenterUser_UserId() {
super();
// TODO Auto-generated constructor stub
}
public CenterUser_UserId(Integer parentUserId, Integer childUserId) {
super();
this.parentUserId = parentUserId;
this.childUserId = childUserId;
}
public Integer getParentUserId() {
return parentUserId;
}
public void setParentUserId(Integer parentUserId) {
this.parentUserId = parentUserId;
}
public Integer getChildUserId() {
return childUserId;
}
public void setChildUserId(Integer childUserId) {
this.childUserId = childUserId;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result
+ ((childUserId == null) ? 0 : childUserId.hashCode());
result = prime * result + ((parentUserId == null) ? 0 : parentUserId.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
CenterUser_UserId other = (CenterUser_UserId) obj;
if (childUserId == null) {
if (other.childUserId != null)
return false;
} else if (!childUserId.equals(other.childUserId))
return false;
if (parentUserId == null) {
if (other.parentUserId != null)
return false;
} else if (!parentUserId.equals(other.parentUserId))
return false;
return true;
}
}
}
4.单表一对多映射--user表----(pid,users)--不生成中间表
--链接:http://www.iteye.com/problems/13092