使用spring,hibernate,JPA批注在连接表中添加更多列 [英] 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")})
有什么办法可以添加另一个列,例如拥有另一个'@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个表:
- 一个
Student
实体类,其嵌入式ID由名字和姓氏组成. - 一个
Teacher
实体类,具有一个自动的长id和一个Set<Student>
作为属性.
- 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 aSet<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屋!