JPA外键连接同名
问题描述:
假设我有:JPA外键连接同名
- 表编辑(ID,BUSINESS_NAME,增值税)
- 表作者(ID,姓名,电子邮件)
- 表书籍(id,title,description,fk_author,fk_editor)。
比方说fk_editor是表格编辑器的ID字段和fk_author外键是表作者的ID字段的外键。
假设的关系书:作者是N:1周和书:编辑是N:1。
问题是:如何通过书籍表加入三张表表? 这意味着,我必须在Book类中添加哪些代码才能让Hibernate理解并与作者和编辑者建立关系?请考虑我在作者和编辑者中拥有相同的id字段名称。 在这里它的示例代码,我需要纠正:
表作者:
package com.bytecode.jpaexample.SpringBootMySqlJpaRestExample;
import javax.persistence.*;
import java.io.Serializable;
@Entity
@Table(name = "authors")
public class Author implements Serializable{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
@OneToMany(fetch = FetchType.LAZY)
private int id;
@Column(name = "name")
private String name;
@Column(name = "surname")
private String surname;
@Column(name = "email")
private String email;
/* constructors and getters and setters omitted intentionally */
}
表编辑:
package com.bytecode.jpaexample.SpringBootMySqlJpaRestExample;
import javax.persistence.*;
import java.io.Serializable;
@Entity
@Table(name = "editors")
public class Editor implements Serializable{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
@OneToMany(fetch = FetchType.LAZY)
private int id;
@Column(name = "business_name")
private String businessName;
@Column(name = "vat")
private String vat;
/* constructors and getters and setters omitted intentionally */
}
表书:
package com.bytecode.jpaexample.SpringBootMySqlJpaRestExample;
import javax.persistence.*;
import java.io.Serializable;
@Entity
@Table(name="books")
public class Book implements Serializable{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private int id;
@Column(name = "title")
private String title;
@Column(name = "description")
private String description;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "id") //authors.id
@Column(name = "fk_author")
private int fk_editor;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "id") //editors.id
@Column(name = "fk_editor")
private int fk_editor;
/* constructors and getters and setters omitted intentionally */
}
两
答
几件事情:
的Author
和Editor
类不应该标注为@OneToMany
他们id
领域:
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private int id;
相反,我猜你想在每一个类另一个领域:
@Entity
@Table(name = "authors")
public class Author implements Serializable {
...
@OneToMany(mappedBy = "author", fetch = FetchType.LAZY)
private List<Book> books;
...
}
@Entity
@Table(name = "editors")
public class Editor implements Serializable {
...
@OneToMany(mappedBy = "editor", fetch = FetchType.LAZY)
private List <Book> books;
...
}
然后,您需要以几种方式更改类Book
:
- 更适当地重命名字段(例如,
fk_author
变成author
);这些必须与相应类别中的mappedBy
设置相匹配,如上所述) - 将字段类型更改为相应的类(例如
Author
),而不是外键类型(例如,int
) - 变化
@JoinColumn
批注指定在books
表(将适当列不目标表),并添加referencedColumnName
设置(尽管,这些是在这种情况下可选的;因为它们将默认为单个主键字段目标实体) - 删除
@Column
注释
看看这是有道理的:
@Entity
@Table(name="books")
public class Book implements Serializable {
...
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "fk_author", referencedColumnName="id")
private Author author;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "fk_editor", referencedColumnName="id")
private Editor editor;
...
}