JPA-Hibernate bean中many-to-many with map collection的设计方案

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值