您的位置:首页 > 其它

ManyToMany(基于注解)使用之进阶(中级版)

2016-07-10 11:12 337 查看
社团和成员就是多对多的关系,一个成员有多个社团,一个社团也有多个成员,这里的多对多映射采用中间表连接的映射策略,建立中间表的映射策略,建立中间表分别引入俩边的主键作为外键。通过中间表映射俩个表之间的关系。

下面就以社团类和成员类为例介绍多对多的映射关系的实例

Club实体类

package com.cn.entity;

import java.io.Serializable;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

/**
* @ClassName: Club
* @Description: 社团的实体类
* @author: Administrator
* @date: 2016年7月6日 下午3:27:43
*/
@Entity //实体类
@Table(name="iyo_club",catalog="iyo") //哪个数据库那张表
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE) //二级缓存
public class Club implements Serializable{

/**
* @fieldName: serialVersionUID
* @fieldType: long
* @Description:
*/
private static final long serialVersionUID = -1576706279212597880L;

private Integer clubId;//社团ID
private String clubIntroction;//社团简介
private String ClubName;//社团名称
private Integer clubLevel;//社团等级
private Integer clubNumber;//社团人数
private Date clubCreateTime;//创建时间
private User user;//创始人
private College college;//所属学院
private Set<Member> member = new HashSet<Member>();

public Club() {
//super();
}

public Club(String clubIntroction, String clubName, Integer clubLevel, Integer clubNumber, Date clubCreateTime,
User user, College college) {
//super();
this.clubIntroction = clubIntroction;
ClubName = clubName;
this.clubLevel = clubLevel;
this.clubNumber = clubNumber;
this.clubCreateTime = clubCreateTime;
this.user = user;
this.college = college;
}

@Id //主键
@GeneratedValue(strategy = GenerationType.IDENTITY) //数据库自增
public Integer getClubId() {
return clubId;
}

public void setClubId(Integer clubId) {
this.clubId = clubId;
}

public String getClubIntroction() {
return clubIntroction;
}

public void setClubIntroction(String clubIntroction) {
this.clubIntroction = clubIntroction;
}

public String getClubName() {
return ClubName;
}

public void setClubName(String clubName) {
ClubName = clubName;
}

public Integer getClubLevel() {
return clubLevel;
}

public void setClubLevel(Integer clubLevel) {
this.clubLevel = clubLevel;
}

public Integer getClubNumber() {
return clubNumber;
}

public void setClubNumber(Integer clubNumber) {
this.clubNumber = clubNumber;
}

public Date getClubCreateTime() {
return clubCreateTime;
}

public void setClubCreateTime(Date clubCreateTime) {
this.clubCreateTime = clubCreateTime;
}

//多对一外键关联
@JsonIgnoreProperties(value={"permission"})
@ManyToOne
@Cache(usage=CacheConcurrencyStrategy.READ_WRITE)//缓存
@JoinTable(name="iyo_club",joinColumns=@JoinColumn(name="userId"),inverseJoinColumns=@JoinColumn(name="userId"))
public User getUser() {
return user;
}

public void setUser(User user) {
this.user = user;
}

@ManyToOne
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
@JoinTable(name = "iyo_club", joinColumns = @JoinColumn(name = "collegeId") , inverseJoinColumns = @JoinColumn(name = "collegeId") )
public College getCollege() {
return college;
}

public void setCollege(College college) {
this.college = college;
}

@ManyToMany(targetEntity=Member.class,cascade=CascadeType.PERSIST,fetch = FetchType.EAGER)
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
//@JoinTable(name = "iyo_memberdesc", joinColumns = { @JoinColumn(name = "clubId") }, inverseJoinColumns = {
//  @JoinColumn(name = "memberId") })
@JoinTable(name="iyo_memberdesc",catalog="iyo",joinColumns = {@JoinColumn(name = "clubId",nullable = false, updatable = false)},inverseJoinColumns = {@JoinColumn(name="memberId",nullable = false, updatable = false)})
public Set<Member> getMember() {
return member;
}

public void setMember(Set<Member> member) {
this.member = member;
}
}


成员类

package com.cn.entity;

import java.io.Serializable;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;
import javax.persistence.Table;

import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

/**
* @ClassName: Member
* @Description: 成员的实体类
* @author: Administrator
* @date: 2016年7月7日 下午1:39:57
*/
@Entity // 实体类
@Table(name = "iyo_member", catalog = "iyo") // 哪个数据库哪张表
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE) // 二级缓存
public class Member implements Serializable {

/**
* @fieldName: serialVersionUID
* @fieldType: long
* @Description:
*/
private static final long serialVersionUID = 6370397842913431307L;

private Integer memberId;// 成员id
private String memberClass;// 成员所在的班级
private String memberMajor;// 所在专业
private String memberName;// 名字
private String memberIphone;// 电话
private Integer memberCard;// 学号
private Date memberDate;// 加入的时间
private College college;// 所在学院
private User user;// 注册id
private Integer memberCardId;// 卡号
private Set<Club> club = new HashSet<Club>();// 成员持有的社团集合

public Member() {

}

public Member(String memberClass, String memberMajor, String memberName, String memberIphone, Integer memberCard,
Date memberDate, College college, User user, Integer memberCardId) {
this.memberClass = memberClass;
this.memberMajor = memberMajor;
this.memberName = memberName;
this.memberIphone = memberIphone;
this.memberCard = memberCard;
this.memberDate = memberDate;
this.college = college;
this.user = user;
this.memberCardId = memberCardId;
}

@Id // 主键
@GeneratedValue(strategy = GenerationType.IDENTITY) // 自增
public Integer getMemberId() {
return memberId;
}

public void setMemberId(Integer memberId) {
this.memberId = memberId;
}

public String getMemberClass() {
return memberClass;
}

public void setMemberClass(String memberClass) {
this.memberClass = memberClass;
}

public String getMemberMajor() {
return memberMajor;
}

public void setMemberMajor(String memberMajor) {
this.memberMajor = memberMajor;
}

public String getMemberName() {
return memberName;
}

public void setMemberName(String memberName) {
this.memberName = memberName;
}

@Column(name = "memberIphone", unique = true) // 表示数据库中该字段是唯一的
public String getMemberIphone() {
return memberIphone;
}

public void setMemberIphone(String memberIphone) {
this.memberIphone = memberIphone;
}

public Integer getMemberCard() {
return memberCard;
}

public void setMemberCard(Integer memberCard) {
this.memberCard = memberCard;
}

public Date getMemberDate() {
return memberDate;
}

public void setMemberDate(Date memberDate) {
this.memberDate = memberDate;
}

@Column(name = "memberCardId", unique = true)
public Integer getMemberCardId() {
return memberCardId;
}

public void setMemberCardId(Integer memberCardId) {
this.memberCardId = memberCardId;
}

@ManyToOne
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
@JoinTable(name = "iyo_member", joinColumns = @JoinColumn(name = "collegeId") , inverseJoinColumns = @JoinColumn(name = "collegeId") )
public College getCollege() {
return college;
}

public void setCollege(College college) {
this.college = college;
}

// 一对一的外键关联
@JsonIgnoreProperties(value = { "permission" })
@OneToOne
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
@JoinTable(name = "iyo_member", joinColumns = @JoinColumn(name = "userId") , inverseJoinColumns = @JoinColumn(name = "userId") )
public User getUser() {
return user;
}

public void setUser(User user) {
this.user = user;
}

//  @JsonIgnoreProperties(value = { "user", "college" }) // 忽略属性
//  @ManyToMany(mappedBy="member",cascade=CascadeType.MERGE)
//  @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) // 缓存属性
//  @JoinTable(name = "iyo_memberdesc", joinColumns = { @JoinColumn(name = "memberId",referencedColumnName="memberId") }, inverseJoinColumns = {
//          @JoinColumn(name = "clubId",referencedColumnName="clubId") })
//   @JoinTable(name="iyo_memberdesc",catalog="iyo",joinColumns =
// {@JoinColumn(name = "memberId",nullable = false, updatable =
// false)},inverseJoinColumns = {@JoinColumn(name="clubId",nullable = false,
// updatable = false)})
@JsonIgnoreProperties(value = { "user", "college" }) // 忽略属性
@ManyToMany(targetEntity=Club.class,cascade=CascadeType.PERSIST,fetch = FetchType.EAGER)
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE) // 缓存属性
@JoinTable(name="iyo_memberdesc",catalog="iyo",joinColumns = {@JoinColumn(name = "memberId",nullable = false, updatable = false)},inverseJoinColumns = {@JoinColumn(name="clubId",nullable = false, updatable = false)})
public Set<Club> getClub() {
return club;
}

public void setClub(Set<Club> club) {
this.club = club;
}
}


测试类

package com.cn.service;

import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import org.apache.log4j.Logger;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.alibaba.fastjson.JSON;
import com.cn.entity.Club;
import com.cn.entity.College;
import com.cn.entity.Member;
import com.cn.entity.Page;
import com.cn.entity.User;

/**
* @ClassName: TestMemberService
* @Description: 新闻类的测试类
* @author: Administrator
* @date: 2016年7月4日 下午2:57:05
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:spring.xml", "classpath:spring-hibernate.xml" })
public class TestMemberService {

private static final Logger LOGGER = Logger.getLogger(TestMemberService.class);

@Autowired
private MemberService memberService;

@Autowired
private ClubService clubService;

@Test
public void save() {
Member member = new Member();
member = memberService.get(14);
Member member1 = memberService.get(12);
// Integer id = memberService.save(member);
Set<Member> st = new HashSet<Member>();
st.add(member);
st.add(member1);
Club club = new Club();
club = clubService.get(31);
//  club.getMember().add(member);
System.out.println(club.getClubId());
clubService.save(club);
//LOGGER.info(JSON.toJSONString(id));
}

@Test
public void savess() {
Club club = new Club();
club = clubService.get(37);
// Integer id = memberService.save(member);
Set<Club> st = new HashSet<Club>();
st.add(club);
Member member = new Member();
member = memberService.get(12);
//ManyToMang的多对多测插入
member.getClub().add(club);
memberService.saveOrUpdate(member);

//LOGGER.info(JSON.toJSONString(id));
}

@Test
public void saves() {
Member member = new Member();
member.setMemberCard(2013081426);
member.setMemberClass("计科13w4");
member.setMemberDate(new Date());
member.setMemberIphone("1589e2436786");
member.setMemberMajor("计算机科学r与技术");
member.setMemberName("琪q琪");
User user = new User();
user.setUserId(2);
member.setUser(user);
College college = new College();
college.setCollegeId(2);
member.setCollege(college);
member.setMemberCardId(123456);
Integer id = memberService.save(member);
LOGGER.info(JSON.toJSONString(id));
}

//查询关联表中的数据
@Test
public void findAll() {
List<Member> members = memberService.findAll();
for (Member member : members) {
Iterator<Club> it = member.getClub().iterator();
while(it.hasNext()){
Club club = it.next();
System.out.println(club.getClubIntroction());
}
}
}

@Test
public void findAlls() {
Page page = new Page();
page.setCurrentPage(1);
page.setTotalNumber(memberService.count());
List<Member> members = memberService.findAll(page);
for (Member member : members) {
System.out.println(member.getMemberClass());
}
}

@Test
public void delete() {
memberService.delete(11);
}
}


使用的maven管理个人使用通过 仅作参考
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息