簡體   English   中英

Java Hibernate JPA 創建一個實體並加入同一列引用的兩個不同的表,具有相同的列名

[英]Java Hibernate JPA create an entity and Join two different tables referenced by the same column, with same column name

我有一個問題只想使用注釋來解決,而不是使用兩個不同的查詢來獲取數據。 我需要連接兩個具有相同列 ID 的不同表。 我有 Travels,並且在特定時間,Travel 中的行被刪除,但現在 TravelHistory(用於保存數據的表)的行只包含需要保存的數據(並且具有相同的 Travel id ...有意義) . 在某些時候,Travel 和 TravelHistory 可能會共存。

我想讓兩個不同的類由相同的 id 映射( travel_id是列的名稱),就像這樣(代碼被簡化):

@Entity
@Table(name = "travel_audit")
public class TravelAudit {
    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "travel_id")
    private Travel travel;
    
    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "travel_id")
    private TravelHistory travelHistory;

}

但 Hibernate 似乎不喜歡那樣(具有相同的name = "travel_id" ),所以我在創建 Bean 時出錯。

對於這個答案,我付出了更多的努力和所有的細節,以便對表格有更多的參考:

@Column(name = "travel_id")
private Long travelId;

@OneToOne(targetEntity = Travel.class, fetch = FetchType.LAZY)
@JoinColumn(name = "travel_id", table = "travel")
private Travel travel;

@OneToOne(targetEntity = TravelHistory.class, fetch = FetchType.LAZY)
@JoinColumn(name = "travel_id", table = "travel_history")
private TravelHistory travelHistory;

但它沒有用。

之后我想做一個Optional<TravelAudit> findByTravelId(Long travelId); 並獲取 Travel 和/或 TravelHistory

我怎樣才能做到這一點? 不幸的是,我認為我將不得不檢索 travel_id(它很長)並分別獲取其他表。

錯誤是:

org.springframework.beans.factory.BeanCreationException:在類路徑資源 [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class] 中定義名稱為“entityManagerFactory”的 bean 創建時出錯:調用 init 方法失敗; 嵌套異常是 javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory

您的審計實體的映射可能是:

@Entity
@Table(name = "travel_audit")
public class TravelAudit {
    @Id
    @Column(name="travel_id")
    private String travelId;

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "travel_id", insertable=false, updatable=false)
    private Travel travel;
    
    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "travel_id", insertable=false, updatable=false)
    private TravelHistory travelHistory;
}

如果您使用 JPA/Hibernate 生成 DDL,您需要確保沒有為 travel_audit.travel_id -> travel 表引用生成約束,因為每當您的應用程序嘗試刪除旅行時它都會被破壞旅行審計實例仍然引用的行。

擁有一個基本映射 (travelId) 將允許您使用該值進行查詢,而不必在兩個表之間進行聯接,並且會使您的查詢復雜化,因為默認的內部聯接會破壞您需要的邏輯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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