JPA外键连接同名

问题描述:

假设我有:JPA外键连接同名

  1. 编辑(ID,BUSINESS_NAME,增值税)
  2. 作者(ID,姓名,电子邮件)
  3. 书籍(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 */ 
} 

几件事情:

AuthorEditor类不应该标注为@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; 
    ... 
}