java - Hibernate/JPA 自动创建外键而不是在多对一关联中使用现有的外键

标签 java spring hibernate jpa spring-boot

我使用:

  • SpringBoot 1.5.1
  • MariaDB/MySQL 10.1.14/15.1
  • org.hibernate.dialect.MySQL5Dialect
  • Hibernate5(默认为 SpringBoot)

这是 SQL 表定义:

CREATE TABLE salaries (
emp_no      BIGINT          NOT NULL,
salary      BIGINT          NOT NULL,
from_date   DATETIME        NOT NULL,
to_date     DATETIME        NOT NULL,
FOREIGN KEY (emp_no) REFERENCES employees (emp_no),
PRIMARY KEY (emp_no, from_date)
) 

这是关联多边上的实体(使用嵌入式 id):

@Entity
@Table(name = "salaries")
public class Salary {

    @EmbeddedId
    private EmpIdFromDatePK empId;

    @Column(name = "to_date", columnDefinition = "DATETIME")
    @Temporal(TemporalType.TIMESTAMP)
    private Date toDate;

    @Column(name = "salary")
    private Long salary;

    @ManyToOne(fetch = FetchType.LAZY)
    @Fetch(FetchMode.JOIN)
    @MapsId("empId")
    @JoinColumns({@JoinColumn(foreignKey = @ForeignKey(name = "salaries_ibfk_1"), name = "emp_no", referencedColumnName = "emp_no")})
    private Employee employee;

    public Salary() {
        super();
    }

    //...
}

关键类:

@Embeddable
public class EmpIdFromDatePK implements Serializable {

    @Column(name = "emp_no")
    private Long empId;

    @Column(name = "from_date", columnDefinition = "DATETIME")
    @Temporal(TemporalType.TIMESTAMP)
    private Date fromDate;

    public EmpIdFromDatePK() {
        super();
    }

    //....
} 

以及关联一侧的实体:

@Entity
@Table(name = "employees")
public class Employee {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "emp_no")
    private Long empId;

    //...

    @OneToMany(mappedBy = "employee")
    private List<Salary> salaryList;

    //...
}

问题:当我使用 ManyToOne 关联时(例如,在员工与工资记录关联的选择中),在数据库中创建了第二个外键:

CONSTRAINT `FKjojacp79fphmajxrdll8fvf5o` FOREIGN KEY (`emp_no`) REFERENCES `employees` (`emp_no`),
CONSTRAINT `salaries_ibfk_1` FOREIGN KEY (`emp_no`) REFERENCES `employees` (`emp_no`)

问题:如何避免这种行为?

提前致谢

最佳答案

你能试试:

@JoinColumn(name="emp_no", referencedColumnName="emp_no")
@ForeignKey(name="salaries_ibfk_1")

?

关于java - Hibernate/JPA 自动创建外键而不是在多对一关联中使用现有的外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42596071/

相关文章:

java - 通过 Spring 注入(inject)空 map

spring - 为什么LocalSessionFactoryBean 不实现getCurrentSession,同时SessionFactory 的实例可以调用该方法?

hibernate - 如何在hibernate查询语言中使用Date函数

java - 使用 hibernate 将金额应用于不同的行

java - 如何创建带圆角的 JButton 扩展?

java - 尝试使用 Return 语句进行 Catch 和 Final 操作

spring - 注释为 ResponseStatus 的自定义异常的动态消息

Spring Security 身份验证日志记录

java - android.support.v7.app.ActionBarActivity 问题

java - 我在实现 Java 合并排序时遇到问题