hibernate注解多对多关联

package com.jpa.demo.com.jpa.demo.domain;

import javax.persistence.*;
import java.util.HashSet;
import java.util.Set;

/**
 * @author : mint6
 * @date : 2018/10/22
 * @description:
 */
@Entity
@Table(name = "student")//指定对应的表名称,如果指定的表名数据库不存在,程序会自己在数据库创建一个表
public class Student {
    @Id
    @GeneratedValue
    private Integer id;
    private String name;
    private  String classes;
    private  String sex;
    @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)//cascade级联状态,fetch是懒加载还是立即
    @JoinTable(
            name = "teacher_test",//中间表名称,如果没有这个表,程序启动后,自动在数据库创建
            //ForeignKey指定外键,none是没有;ConstraintMode.NO_CONSTRAINT是不创建
            foreignKey = @ForeignKey(name = "none", value = ConstraintMode.NO_CONSTRAINT),
            //joinColumns 是主控方给当前类指定关联,name是当前类student的属性关联的中间表属性sid,
            // referencedColumnName 是当前类的属性student实体类的id
            joinColumns = {@JoinColumn(name = "sid", referencedColumnName = "id", nullable = false)},
            //inverseJoinColumns也就是被控方的属性,
            // referencedColumnName后面写Teacher的属性id,JoinColumn写中间表的属性名称
            inverseJoinColumns = {@JoinColumn(name = "tid", referencedColumnName = "id", nullable = false
            )})
    private Set<Teacher> teacher = new HashSet<Teacher>();//这个被控方一般使用Set列表

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getClasses() {
        return classes;
    }

    public void setClasses(String classes) {
        this.classes = classes;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public Set<Teacher> getTeacher() {
        return teacher;
    }

    public void setTeacher(Set<Teacher> teacher) {
        this.teacher = teacher;
    }
}

 当前类主控方,作为属性的类被控方。

上控 下被控,前面关系表,后面真实类。

这个表在数据库是这样的,teacher_test是中间表,也就是关联两个类关系的表,这里写好后,启动程序,程序会创建表。

帮助理解:

属性 是否必须 说明
name 指定该连接表的表名
JoinColumns 该属性值可接受多个@JoinColumn,用于配置连接表中外键列的信息,这些外键列参照当前实体对应表的主键列
inverseJoinColumns 该属性值可接受多个@JoinColumn,用于配置连接表中外键列的信息,这些外键列参照当前实体的关联实体对应表的主键列
targetEntity 该属性指定关联实体的类名。在默认情况下,Hibernate将通过反射来判断关联实体的类名
catalog 设置将该连接表放入指定的catalog中。如果没有指定该属性,连接表将放入默认的catalog
schema 设置将该连接表放入指定的schema中。如果没有指定该属性,连接表将放入默认的schema
uniqueConstraints 该属性用于为连接表增加唯一约束
indexes 该属性值为@Index注解数组,用于为该连接表定义多个索引

猜你喜欢

转载自blog.csdn.net/Mint6/article/details/83313207