add more columns in join table using spring, hibernate, JPA Annotations

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")})

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")})

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

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.

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.

I created 2 tables:

A Student entity class with an embedded id composed by first name and last name.
A Teacher entity class with an automatic long id and a Set<Student> as property.
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>();

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

@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

@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.

EDIT:

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):

STUDENT table:

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

TEACHER table:

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 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`)
)
内容概要:本文详细探讨了基于MATLAB/SIMULINK的多载波无线通信系统仿真及性能分析,重点研究了以OFDM为代表的多载波技术。文章首先介绍了OFDM的基本原理和系统组成,随后通过仿真平台分析了不同调制方式的抗干扰性能、信道估计算法对系统性能的影响以及同步技术的实现与分析。文中提供了详细的MATLAB代码实现,涵盖OFDM系统的基本仿真、信道估计算法比较、同步算法实现和不同调制方式的性能比较。此外,还讨论了信道特征、OFDM关键技术、信道估计、同步技术和系统级仿真架构,并提出了未来的改进方向,如深度学习增强、混合波形设计和硬件加速方案。; 适合人群:具备无线通信基础知识,尤其是对OFDM技术有一定了解的研究人员和技术人员;从事无线通信系统设计与开发的工程师;高校通信工程专业的高年级本科生和研究生。; 使用场景及目标:①理解OFDM系统的工作原理及其在多径信道环境下的性能表现;②掌握MATLAB/SIMULINK在无线通信系统仿真中的应用;③评估不同调制方式、信道估计算法和同步算法的优劣;④为实际OFDM系统的设计和优化提供理论依据和技术支持。; 其他说明:本文不仅提供了详细的理论分析,还附带了大量的MATLAB代码示例,便于读者动手实践。建议读者在学习过程中结合代码进行调试和实验,以加深对OFDM技术的理解。此外,文中还涉及了一些最新的研究方向和技术趋势,如AI增强和毫米波通信,为读者提供了更广阔的视野。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值