@ManyToMany中间表附加字段设计

在使用@ManyToMany时,若中间表只有相应的外键字段可以直接建立两个对应的Entity 设置ManyToMany

@ManyToMany 两个表多对多关联

但若是中间表有自己的附加字段,这需要为中间表建立Entity

具体如下:

Teacher <=> Student 中间表 teacher_student 附加字段 id(自增),siteId(站点id方便批删除)

增加 Teacher <=> Student 关联时,增加新的TeacherStudent

Entity:

@Entity
@Table(name = "teacher")
public class Teacher {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @Column(name = "name")
    private String name;

    @Column(name = "age")
    private int age;

    @ManyToMany(cascade = CascadeType.PERSIST, fetch=FetchType.LAZY)
    @JoinTable(name="teacher_student",joinColumns={@JoinColumn(name="tid")},inverseJoinColumns={@JoinColumn(name="sid")})
    private Set<Student> students;

    @OneToMany(mappedBy="teacher", fetch = FetchType.LAZY)
    private Set<TeacherStudent> teacherStudents;

    public int getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Set<Student> getStudents() {
        return students;
    }

    public void setStudents(Set<Student> students) {
        this.students = students;
    }

    public Set<TeacherStudent> getTeacherStudents() {
        return teacherStudents;
    }

    public void setTeacherStudents(Set<TeacherStudent> teacherStudents) {
        this.teacherStudents = teacherStudents;
    }
}
@Entity
@Table(name = "student")
public class Student {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @Column(name = "name")
    private String name;

    @Column(name = "age")
    private int age;

    @ManyToMany(cascade = CascadeType.PERSIST, fetch=FetchType.LAZY)
    @JoinTable(name="teacher_student", joinColumns={@JoinColumn(name="sid")}, inverseJoinColumns={@JoinColumn(name="tid")})
    private Set<Teacher> teachers;

    @OneToMany(mappedBy="student", fetch = FetchType.LAZY)
    private Set<TeacherStudent> teacherStudents;

    public int getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Set<Teacher> getTeachers() {
        return teachers;
    }

    public void setTeachers(Set<Teacher> teachers) {
        this.teachers = teachers;
    }

    public Set<TeacherStudent> getTeacherStudents() {
        return teacherStudents;
    }

    public void setTeacherStudents(Set<TeacherStudent> teacherStudents) {
        this.teacherStudents = teacherStudents;
    }
}

中间表

@Entity
@Table(name = "teacher_student")
public class TeacherStudent {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @ManyToOne(fetch = FetchType.LAZY)
    @Cascade(value = CascadeType.SAVE_UPDATE)
    @JoinColumn(name="tid")
    private Teacher teacher;

    @ManyToOne(fetch = FetchType.LAZY)
    @Cascade(value = CascadeType.SAVE_UPDATE)
    @JoinColumn(name="sid")
    private Student student;

    @JoinColumn
    private int siteId;

    public int getId() {
        return id;
    }

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

    public Teacher getTeacher() {
        return teacher;
    }

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

    public Student getStudent() {
        return student;
    }

    public void setStudent(Student student) {
        this.student = student;
    }

    public int getSiteId() {
        return siteId;
    }

    public void setSiteId(int siteId) {
        this.siteId = siteId;
    }
}
时间: 2024-08-25 04:25:48

@ManyToMany中间表附加字段设计的相关文章

关系型数据库设计表和字段的思路

做数据库的设计一定要有思路,把各个表的依赖关系整理清楚.我们就讲一个小例子就可以让你轻松掌握到设计数据表和字段的思路 创建表和字段之前首先要明确各表之间的依赖关系场景: 比如现在要做一个电商网站的数据库整理清楚要设计的表:用户信息表,商品信息表,结算的表.PS:购物车的表请根据此例举一反三的去思考它的依赖关系,吴小迪相信聪明的您一定会做出来的思路:我们要 先设置不需要依赖其他表的表的字段(这句话一定要看懂,看不懂再来几遍,看懂为止),比如说用户信息和商品信息的表就 不需要依赖 其他的表,那么我们

关于数据库‘状态’字段设计的思考与实践

最近在做订单及支付相关的系统,在订单表的设计阶段,团队成员就‘订单状态’数据库字段设计有了一些分歧,网上也有不少关于这方面的思考和探讨,结合这些资料和项目的实际情况,拟对一些共性问题进行更深一层的思考,笔耕在此,和大家一起探讨. 问题综述 这里的分歧点即有团队内部的分歧点,也有网络上常见的一些分歧点,先将存在的分歧点抛出来: 1.订单表的‘订单状态’字段对应的字典值应当包含哪些状态值?对于‘已评论’.‘已退货’.’已退款’这类状态是放到‘订单状态’中?还是独立一个字段标识? 2.订单表的‘订单状

Hibernate给表和字段设置前后缀及分隔符

在<一口一口吃掉Hibernate(一)--使用SchemaExport生成数据表>中介绍了如何生成数据表.但是这只是最基本的.hibernate在生成或者操作数据库时,会受一些限制.比如一开始设计表的时候,直接写成了user(id,name,password,createTime)  这种格式的.但是客户后来要求表名称要以"t_"开头,字段名要以"stu_"开头,可以是一些数据库的关键字,单词之间以"_"隔开,方便他们维护.例如:T

动态表单数据库设计

需求: 能够根据数据库在界面动态显示表单,包括表单类型.名称等,并且必须提供 添加新表单,修改表单等功能. 为了满足客户不断的需求变化,有时候需要为某商品增加.修改.删除.属性,这样的话以往的数据库表就很难实现, 因为表的字段是定死了 如果你需要增加一个属性的时候 ,就必须修改表,听说这是不允许的~~. 所以我们要设计一个灵活的数据库 下面以电脑设备为例: pc 现有属性 name cpu ram disk 现在我们要为pc添加一个 mainboard 属性. 既然必须提供增加表单,那么我们创建

用户和角色:通用权限管理系统数据库表结构如何设计?

一,前言 权限管理系统的应用者应该有三种不同性质上的使用,A,使用权限B,分配权限C,授权权限 本文只从<使用权限>和<分配权限>这两种应用层面分析,暂时不考虑<授权权限>这种.二,初步分析用户和角色 说到权限管理,首先应该想到,当然要设计一个用户表,一个权限表.这样就决定了一个人有什么样的权限.做着做着就会发现这样设计太过繁琐,如果公司里面所有员工都有这样的权限呢,每一个人都要配置?那是一件很痛苦的事情.因此再添加一个角色表,把某些人归为一类,然后再把权限分配给角色.

关于数据库优化1——关于count(1),count(*),和count(列名)的区别,和关于表中字段顺序的问题

1.关于count(1),count(*),和count(列名)的区别 相信大家总是在工作中,或者是学习中对于count()的到底怎么用更快.一直有很大的疑问,有的人说count(*)更快,也有的人说count(列名)更快,那到底是谁更快,我将会在本文中详细介绍一下到底是count(1),count(*)和count(列明)的区别,和更适合的使用场景. 往常在工作中有人会说count(1)比count(*)会快,或者相反,首先这个结论肯定是错的,实际上count(1)和count(*)并没有区别

如何查出同一张表中字段值重复的记录

如何查出同一张表中字段值重复的记录 (2013-03-25 11:28:51) 转载▼ 比如现在有一人员表(表名:peosons) 若想将姓名.身份证号.住址这三个字段完全相同的记录查询出来select p1.* from persons p1,persons p2where p1.idp2.id and p1.cardid = p2.cardid and p1.pname = p2.pname and p1.address = p2.address 可以实现上述效果. 几个删除重复记录的SQL

oracle查看所有表及字段

oracle表设计 http://blog.csdn.net/lanpy88/article/details/7580820 Oracle查看所有表和字段 获取表: select table_name from user_tables; //当前用户的表 select table_name from all_tables; //所有用户的表 select table_name from dba_tables; //包括系统表 select table_name from dba_tables w

数据库的字段设计的几个心得

数据库的字段设计有很多细节性的技巧,下面将过去在开发中体会到经验整理出来,做个备忘. tinyint 是-128到128 .当属性设置为unsigned的时候.最大值就是255了.现在知道为什么需要设置为unsigned属性了.原来是为了最大限度的使用给予的存储空间.如果不设置.那么假如你的值都是正数的.那么-128这一百多个数字就相当于是浪费了.澳门葡京赌场是真的吗 tinyint会自动设置为tinyint(3). smallint 不设置unsigned的时候,也有3万多的样子. tinyt