我使用:
- 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/