使用spring,hibernate,JPA批注在连接表中添加更多列 [英] add more columns in join table using spring, hibernate, JPA Annotations

查看:68
本文介绍了使用spring,hibernate,JPA批注在连接表中添加更多列的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我们可以在联接表注释中添加更多列吗?通常,我看到人们最终会添加两列,如下面的示例所示.

Can we add more columns in a join table annotation? Generally i see people ending up with adding two columns as shown in the below example.

@JoinTable(name="mapping_table",
               joinColumns={@JoinColumn(name="request_id")},
               inverseJoinColumns={@JoinColumn(name="requester_id")})

有什么办法可以添加另一个列,例如拥有另一个'@JoinColumn'吗?我的意思是如下图所示.

Is there any way that we can add another column like having another '@JoinColumn'? I mean something like as shown below.

@JoinTable(name="mapping_table",
                   joinColumns={@JoinColumn(name="request_id")},
                   inverseJoinColumns={@JoinColumn(name="requester_id")
                                       @JoinColumn(name="requester_id")})

,否则具有另一个"inverseJoinColumn".我试图找到解决方案无法弥补. 预先感谢.

or else having another "inverseJoinColumn". I tried finding solution couldn't make it up. Thanks in advance.

推荐答案

使用@javax.persistence.JoinColumns(在最后注意)批注定义复合外键的映射.您应该具有以下内容:

Use the @javax.persistence.JoinColumns (note the 's' at the end) annotation to define mappings for composite foreign keys. You should have something like the following:

@JoinTable(name="mapping_table",
               joinColumns={@JoinColumn(name="request_id")},
               inverseJoinColumns={@JoinColumns({
                   @JoinColumn(name="requester_id"),
                   @JoinColumn(name="requester_id")})
               }
)

我认为应该可以.

I think it should work.

很抱歉,第一个答案:我认为@JoinColumns批注不能在@JoinTable批注内使用.因此,我决定进行更多调查.

Sorry for the first answer: I think that the @JoinColumns annotation can't be used inside a @JoinTable one. So I decided to investigate a little bit more.

我创建了2个表:

  1. 一个Student实体类,其嵌入式ID由名字和姓氏组成.
  2. 一个Teacher实体类,具有一个自动的长id和一个Set<Student>作为属性.
  1. A Student entity class with an embedded id composed by first name and last name.
  2. A Teacher entity class with an automatic long id and a Set<Student> as property.

我用@ManyToMany关系映射了Set属性,并且在inverseJoinColumns属性中使用了@JoinColumn注释数组:

I mapped the Set property with a @ManyToMany relationship, and I used an array of @JoinColumn annotations in the inverseJoinColumns property:

@ManyToMany(fetch=FetchType.EAGER)
@JoinTable(
        name="STUDENT_TEACHER",
        joinColumns=@JoinColumn(name="TEACHER_ID"),
        inverseJoinColumns={
            @JoinColumn(name="STUDENT_FIRSTNAME"),
            @JoinColumn(name="STUDENT_LASTNAME")
        }
)
private Set<Student> students = new HashSet<Student>();

我进行了一些测试,以检查一切工作正常,并且没有问题(获取类型只是为了拥有更简单的测试用例).我在这里添加我正在使用的2个实体的代码:

I made some tests to check that all was working fine, and I had no problems (the fetch type is just to have easier test cases). I add here the code of the 2 entities I'm using:

Student.java

Student.java

@Entity
public class Student {

    @EmbeddedId
    private Id id = new Id();

    public Id getId() {
        return id;
    }

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

    @Embeddable
    public static class Id implements Serializable {
        private static final long serialVersionUID = 1L;

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

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

        public Id() { }

        public Id(String firstname, String lastname) {
            studentFirstname = firstname;
            studentLastname = lastname;
        }

        @Override
        public boolean equals(Object obj) {
            if (obj instanceof Id) {
                Id id = (Id)obj;
                return studentFirstname.equals(id.studentFirstname) &&
                        studentLastname.equals(id.studentLastname);
            }
            return false;
        }

        @Override
        public int hashCode() {
            return studentFirstname.hashCode() + studentLastname.hashCode();
        }
    }
}

Teacher.java

Teacher.java

@Entity
public class Teacher {
    @Id @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;

    private String firstname;

    private String lastname;

    @ManyToMany(fetch=FetchType.EAGER)
    @JoinTable(
            name="STUDENT_TEACHER",
            joinColumns=@JoinColumn(name="TEACHER_ID"),
            inverseJoinColumns={
                @JoinColumn(name="STUDENT_FIRSTNAME"),
                @JoinColumn(name="STUDENT_LASTNAME")
            }
    )
    private Set<Student> students = new HashSet<Student>();

    public Long getId() {
        return id;
    }

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

    public String getFirstname() {
        return firstname;
    }

    public void setFirstname(String firstname) {
        this.firstname = firstname;
    }

    public String getLastname() {
        return lastname;
    }

    public void setLastname(String lastname) {
        this.lastname = lastname;
    }

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

    public void addStudents(Student student) {
        students.add(student);
    }
}

您只需要使代码适应您的特定情况即可.希望您可以通过此答案解决您的问题.

You just have to adapt the code to your particular situation. I hope you can solve your problem with this answer.

我让Hibernate在hbm2ddl.auto选项设置为update的情况下创建表.它创建了一个STUDENT表,一个TEACHER表和一个STUDENT_TEACHER连接表.我在此处添加生成的CREATE TABLE语句(使用MySQL):

I let Hibernate create the tables with the hbm2ddl.auto option set to update. It created a STUDENT table, a TEACHER table and a STUDENT_TEACHER join table. I add here the CREATE TABLE statements generated (using MySQL):

学生表:

CREATE TABLE `student` (
  `FIRST_NAME` varchar(255) NOT NULL,
  `LAST_NAME` varchar(255) NOT NULL,
  PRIMARY KEY (`FIRST_NAME`,`LAST_NAME`)
)

教师表:

CREATE TABLE `teacher` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `firstname` varchar(255) DEFAULT NULL,
  `lastname` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
)

STUDENT_TEACHER表:

STUDENT_TEACHER table:

CREATE TABLE `student_teacher` (
  `TEACHER_ID` bigint(20) NOT NULL,
  `STUDENT_FIRSTNAME` varchar(255) NOT NULL,
  `STUDENT_LASTNAME` varchar(255) NOT NULL,
  PRIMARY KEY (`TEACHER_ID`,`STUDENT_FIRSTNAME`,`STUDENT_LASTNAME`),
  KEY `FK13A0C19E102E6B8F` (`STUDENT_FIRSTNAME`,`STUDENT_LASTNAME`),
  KEY `FK13A0C19EC177BFF2` (`TEACHER_ID`),
  CONSTRAINT `FK13A0C19EC177BFF2` FOREIGN KEY (`TEACHER_ID`) REFERENCES `teacher` (`id`),
  CONSTRAINT `FK13A0C19E102E6B8F` FOREIGN KEY (`STUDENT_FIRSTNAME`, `STUDENT_LASTNAME`) REFERENCES `student` (`FIRST_NAME`, `LAST_NAME`)
)

这篇关于使用spring,hibernate,JPA批注在连接表中添加更多列的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆