Java 对多个@OneToOne映射使用通用数据对象(和表)

Java 对多个@OneToOne映射使用通用数据对象(和表),java,hibernate,Java,Hibernate,我希望有一个“通用”类型的对象映射到单个数据库表,在这种情况下,应该由一种鉴别器列group_ID引用,而不是将几个小对象(它们的属性基本相同,如ID和NAME)映射为@OneToOne 代码示例应该清楚地说明我想要实现的目标: @Entity @Table(name = "GENERAL_DATA") public class GeneralData { @Id @Column(name = "GROUP_ID") private int groupId;

我希望有一个“通用”类型的对象映射到单个数据库表,在这种情况下,应该由一种鉴别器列
group_ID
引用,而不是将几个小对象(它们的属性基本相同,如ID和NAME)映射为
@OneToOne

代码示例应该清楚地说明我想要实现的目标:

@Entity
@Table(name = "GENERAL_DATA")
public class GeneralData {

    @Id
    @Column(name = "GROUP_ID")
    private int groupId;

    @Id
    @Column(name = "ID")
    private int id;

    @Column(name = "NAME")
    private String name;
}

@Entity
@Table(name = "INVOICE")
public class Invoice {

    @OneToOne
    @JoinColumn(name = "STATUS")
    private GeneralData status;

    @OneToOne
    @JoinColumn(name = "COLOR")
    private GeneralData color;
}
GeneralData的数据库表结构应如下所示:

group_id    id     name
-----------------------------
1           1      Active 
1           2      Processing 
1           3      Cancelled
2           1      Blue 
2           2      Green 
2           3      Red 

为什么不去掉GeneralData实体并在invoice实体中使用简单的枚举?如果您有指定的状态/颜色,这是更好的方法

@Entity
@Table(name = "INVOICE")
public class Invoice {

    @Column(name = "STATUS")
    private Status         status;

    @Column(name = "COLOR")
    private Color         color;

}

public enum Status {
    ACTIVE,
    PROCESSING,
    CANCELLED
}

// ...

我不明白你的问题,你到底在问什么?我也想到了这个主意。我看到的问题是,在使用枚举时,名称是常量(除非我使用来自MessageSource的消息,并将枚举作为键),我无法使用SQL方法进行排序,也无法添加更多属性(这可以用GeneralData轻松完成。好的,但是您的解决方案看起来很难看。也许用enum替换groupId会有一点帮助。但是您的解决方案会导致您通过引用错误的GeneralData(使用错误的组id)很容易出错。)而且你需要更多的异常处理。更重要的是,我不明白为什么你需要数据库中的状态/颜色。如何将新状态添加到数据库中?如果你要给用户提供选项,我建议你去掉常规数据,为每个参数创建单独的实体。另外,你真正的问题是什么?