2015-05-12 79 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注释来声明为主键。您的案例中的外键需要是关联实体或表中的主键。 –