2015-05-12 76 views
3

我需要堅持一個數據結構,它的值可以是字符串,雙精度或日期。Hibernate OneToOne映射到不同的表

有沒有辦法做一對一的映射,條件由表?對於實體映射重複列:

我想這...

@Table(name = "FIELD_CRITERIA") 
public class FieldCriteriaEntity implements Identifiable{ 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "CRITERIA_KEY", unique = true, nullable = false) 
    private Long id; 

    @OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL,optional=true) 
    @JoinColumn(name="CRITERIA_ID") 
    private StringCriteriaEntity stringCriteria; 

    @OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL,optional=true) 
    @JoinColumn(name="CRITERIA_ID") 
    private NumeriCriteriaEntity numericCriteria; 

    @OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL,optional=true) 
    @JoinColumn(name="CRITERIA_ID") 
    private DateCriteriaEntity dateCriteria; 
}

然而,休眠不喜歡這樣的:

造成的:org.hibernate.MappingException

有沒有辦法配置hibernate來處理這個問題?或者我應該簡單地重新建模FIELD_CRITERIA表以包含3個可選的OneToMany關係?

回答

0

首先,您可以嘗試使DateCriteriaEntity和NumericCriteriaEntity成爲「一對一」關係的所有者,而不是FieldCriteriaEntity。將CRITERIA_ID列移動到對應於NumericCriteriaEntity和DateCriteriaEntity的表中,以便該列將FieldCriteriaEntity id存儲爲外鍵,並在FieldCriteriaEntity中使用@OneToMany(mappedBy =「對應字段名稱」),而不是您的變體。

考慮這篇文章http://uaihebert.com/jpa-onetoone-unidirectional-and-bidirectional/

0

我想實現的更好的方法,這是用稍微返工你的實體設計。請參閱下面的類圖。您可以創建一個抽象CriteriaEntity,它將criteriaId作爲主鍵。請仔細選擇你的子類的繼承策略。如果標準實體相對簡單,那麼考慮使用SINGLE_TABLE或者移至TABLE_PER_CLASS。

@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 

JPA entity class diagram

您將需要返工您FieldCriteriaEntity只使用一個映射。請參閱以下內容

@Table(name = "FIELD_CRITERIA") 
public class FieldCriteriaEntity implements Identifiable{ 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "CRITERIA_KEY", unique = true, nullable = false) 
    private Long id; 

    @OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL,optional=true) 
    @JoinColumn(name="CRITERIA_ID") 
    private CriteriaEntity criteria; 
} 

希望這有助於!

+0

我試着實現你的建議,但我遇到了抽象類的問題。 @Entity @Inheritance(策略= InheritanceType.TABLE_PER_CLASS) 公共抽象類FieldCriteriaEntity 錯誤是:org.hibernate.AnnotationException:通過引起不爲實體指定的標識符:murex.risk.compliance.excess.entities.FieldCriteriaEntity –

+0

爲什麼我需要爲實體指定一個標識符,如果它是抽象的。 –

+0

對不起隊友忘了在我之前的帖子中提到它,criteriaId需要使用@Id註釋來聲明爲主鍵。您的案例中的外鍵需要是關聯實體或表中的主鍵。 –