1
我用:休眠/ JPA自動創建外鍵,而不是使用exisiting在國外很多關鍵的一個協會
- SpringBoot 1.5.1
- MariaDB的/ MySQL的10.1.14/15.1
- 組織。 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'解決了這個問題:' @JoinColumn(foreignKey = @ForeignKey(name =「salaries_ibfk_1」),name =「emp_no」,referencedColumnName =「emp_no」)'。謝謝! PS:不像你描述的那樣嵌套@ @ ForeignKey不適合我 – matthiasboesinger