2017-12-18 412 views
2

有沒有辦法使用另一個實體的主鍵作爲主鍵而不使用Embeddable或Id類。例如:如何在春季啓動jpa中使用外部ID作爲主要ID?

@Table(name = "employee") 
@Entity 
public class Employee implements Serializable { 

    @Id 
    @JoinColumn(name = "person_id") 
    private Person person; 

這裏,Person是另一個實體,and person_id是主鍵。 在此先感謝

+0

'Person'&'Employee' @OneToOne有關嗎? – pirho

回答

4

是的,如果這是唯一放慢參數構建的PK,你可以做這樣的

public class Employee implements Serializable { 

    @Id 
    @Column(name="person_id") 
    private Long personId; 

    @JoinColumn(name = "person_id") 
    private Person person; 

但是,如果是這樣的話是沒有用做的,如果員工有相同的主鍵然後他們應該在同一個表中,不需要將它們分開在兩個表中。

在我們所處理的含有人那麼我們需要創建一個embedable鍵複合主鍵的情況下:

@Embeddable 
public class CompositeKey{ 

    @Column(name="person_id") 
    private Long personId; 
    ... // other attributes 
} 

public class Employee implements Serializable { 

    @EmbeddedId CompositeKey employeeId; 

    @JoinColumn(name = "person_id") 
    private Person person; 

另需注意,這裏是你的關係的註釋,你應該讓你的人OneToOne註解參考:

@OneToOne 
@JoinColumn(name = "person_id") 
private Person person; 
+0

感謝您的回答。我已經熟悉這樣的東西。不想使用單獨的表格或只能嵌入一個字段。也許,將來會有這方面的工作。雖然 – user2083529

1

對我來說似乎Employee可以延長Person?如果是這種情況,那麼繼承就會以「自然」的方式進行。

@Entity 
@Inheritance(strategy=InheritanceType.JOINED) 
public class Person implements Serializable { 
    @Id 
    @GeneratedValue 
    @Getter 
    private Long id; 
} 

@Entity 
public class Employee extends Person implements Serializable { 

} 
+0

因此,如果我從Employee中刪除一行,那麼它也會從Person表中刪除?或者如果兩個表中的兩列具有相同的名稱但目的不同,會發生什麼? – user2083529

+0

@ user2083529 1st是的。我不知道爲什麼其他人應該使用相同的ID,除非想指出**相同**'實體'。第二,你可以在繼承類中重寫字段,但我不會那樣做,但是如果可能的話,可以根據用途更好地命名字段。 – pirho

+0

我會投票給它。儘管這對我來說不是一個解決方案。 – user2083529