[英]Dynamic JPA @JoinColumn Name
我對JPA經驗不是很豐富,並且很好奇是否可以進行以下操作。
假設我有一個班級Project
,如下所示:
@Entity
public class Project {
@Id
private String projectCode;
private String departmentId;
/*
* Is something like this possible with JPA?
*/
if (departmentId == null) {
@JoinColumn(name = "projectCode", referencedColumnName = "assignedProject")
} else {
@JoinColumn(name = "departmentId", referencedColumnName = "id")
}
@OneToMany(targetEntity = Employee.class)
private List<Employee> contributors;
// getters/setters
}
因此,我想根據departmentId
的存在來填充contributors
列表。
JPA有可能嗎? 還是我必須指定由兩個變量映射的兩個List<Employee>
字段,並在應用程序邏輯中執行適當的檢查?
謝謝你的幫助。
/*
* Is something like this possible with JPA?
*/
if (departmentId == null) {
@JoinColumn(name = "projectCode", referencedColumnName = "assignedProject")
} else {
@JoinColumn(name = "departmentId", referencedColumnName = "id")
}
不,JPA無法做到這一點,您將為此感到高興。
您可以通過使用Java中的繼承來實現所需的功能。 首先創建一個abstract
實體,其中包含表的所有公共字段。 然后,您可以創建一個具有projectCode
屬性的實體子類,以及另一個具有departmentId
屬性的實體子類。
在RDBMS級別上,對於像我們剛剛構建的對象模型這樣的簡單對象模型,可以映射一個表。 在abstract
實體中,您將進行如下注釋以實現此目的:
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "DTYPE", discriminatorType = STRING, length = 1)
@DiscriminatorValue("?")
@Entity
public abstract class Project {
:
:
}
@DiscriminatorValue("P")
public class ProjectCodeProject extends Project {
:
:
}
請記住,RDBMS不具有繼承知識或繼承概念。 繼承僅存在於Java端。 在數據庫中,繼承由元數據表示。 “ Discriminator”是出現在數據庫表中的特殊列(此處稱為“ DTYPE”),用於通知JPA特定列表示哪個子類。 在上面,選擇代碼“ P”來表示具有PROJECTCODE屬性而不是DEPARTMENTID屬性的數據庫記錄。
使用這樣的類層次結構將使您擁有一個表,該表的行可以具有departmentId或projectCode作為屬性(不能同時包含兩者)。 由於表的所有行都是Projects
,因此使用Java開發通用邏輯以使用子類型應該相對簡單。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.