【问题标题】:JPA connect foreign keys with same nameJPA 连接同名外键
【发布时间】:2018-02-05 13:14:06
【问题描述】:

假设我有:

  1. editors(id、business_name、vat)
  2. 作者(id、姓名、电子邮件)
  3. 书籍(id、标题、描述、fk_author、fk_editor)。

假设 fk_editor 是表编辑器的 id 字段的外键,fk_author 是表作者的 id 字段的外键。

假设关系 books:authorsn:1 并且 books:editorsn: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 */
}

【问题讨论】:

    标签: hibernate jpa orm


    【解决方案1】:

    几件事:

    AuthorEditor 类的 id 字段不应使用 @OneToMany 注释:

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

    【讨论】:

      猜你喜欢
      • 2015-12-31
      • 2019-01-05
      • 2020-06-07
      • 1970-01-01
      • 2011-08-07
      • 2020-11-25
      • 1970-01-01
      • 2013-01-18
      • 1970-01-01
      相关资源
      最近更新 更多