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

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

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

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 = new HashSet();

    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 getMember() {
        return member;
    }

    public void setMember(Set 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 = new HashSet();// 成员持有的社团集合

    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 getClub() {
        return club;
    }

    public void setClub(Set 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 st = new HashSet();
        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 st = new HashSet();
        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 members = memberService.findAll();
        for (Member member : members) {
            Iterator 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 members = memberService.findAll(page);
        for (Member member : members) {
            System.out.println(member.getMemberClass());
        }
    }

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

使用的maven管理个人使用通过 仅作参考

你可能感兴趣的:(hibernate,映射)