簡體   English   中英

動態JPA @JoinColumn名稱

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM