Java Hibernate OneToOne映射到不同的表

Java Hibernate OneToOne映射到不同的表,java,database,hibernate,database-design,Java,Database,Hibernate,Database Design,我需要持久化一个数据结构,它的值可以是字符串、双精度或日期 有没有一种方法可以按表进行一对一的映射 我试过这个 @Table(name = "FIELD_CRITERIA") public class FieldCriteriaEntity implements Identifiable{ @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "CRITERIA_KEY", unique =

我需要持久化一个数据结构,它的值可以是字符串、双精度或日期

有没有一种方法可以按表进行一对一的映射

我试过这个

@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;
}
但是,hibernate不喜欢这样:

原因:org.hibernate.MappingException:实体映射中的重复列:


有没有办法配置hibernate来处理这个问题?或者我应该简单地重新建模FIELD_CRITERIA表,以包括3个可选的OneToMany关系吗?

首先,您可以尝试使DateCriteriaEntity和NumericCriteriaEntity成为“一对一”关系的所有者,而不是FieldCriteriaEntity。将CRITERIA_ID列移动到与NumericCriteriaEntity和DateCriteriaEntity相对应的表中,以便该列将FieldCriteriaEntity ID存储为外键,并在FieldCriteriaEntity中使用@OneToMany(mappedBy=“对应字段名”),而不是您的变体


考虑这篇文章

我想实现这一点的更好方法是稍微修改实体设计。请参见下面的类图。您可以创建一个抽象CriteriaEntity,它将criteriaId作为主键。请仔细选择子类的继承策略。如果标准实体比较简单,那么考虑使用单列表或移动到Tabel-Pyl类。
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)

您需要重新编写
FieldCriteriaEntity
,以便只使用一个映射。请参见以下内容

@Table(name=“FIELD\u标准”)
公共类FieldCriteriaEntity实现可识别{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
@列(name=“CRITERIA\u KEY”,unique=true,nullable=false)
私人长id;
@OneToOne(fetch=FetchType.EAGER,cascade=CascadeType.ALL,可选=true)
@JoinColumn(name=“CRITERIA\u ID”)
私人标准;实体标准;
}

希望这有帮助

我试图实现你的建议,但是抽象类有问题@Entity@Inheritation(strategy=InheritanceType.TABLE_PER_CLASS)公共抽象类FieldCriteriaEntity错误是:由以下原因引起:org.hibernate.AnnotationException:未为实体指定标识符:murex.risk.compliance.Overse.entities.FieldCriteriaEntity为什么需要为实体指定标识符,如果它是抽象的。很抱歉,mate在我之前的帖子中忘了提到它,那么需要使用@Id注释将criteriaId声明为主键。您案例中的外键必须是关联实体或表中的主键。