2017-03-04 63 views
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`) 

問:我怎樣才能避免這種情況?

在此先感謝

回答

1

你能嘗試:

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

+0

我的壞 - 因爲只有一列外鍵,一個普通的'@ JoinColumn'解決了這個問題:' @JoinColumn(foreignKey = @ForeignKey(name =「salaries_ibfk_1」),name =「emp_no」,referencedColumnName =「emp_no」)'。謝謝! PS:不像你描述的那樣嵌套@ @ ForeignKey不適合我 – matthiasboesinger

0

JPA 2.1只支持通過@ForeignKey註釋來定義外鍵。

所以如果你正在使用JPA舊版本比2.1,我認爲你不能做到這一點