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)很容易出错。)而且你需要更多的异常处理。更重要的是,我不明白为什么你需要数据库中的状态/颜色。如何将新状态添加到数据库中?如果你要给用户提供选项,我建议你去掉常规数据,为每个参数创建单独的实体。另外,你真正的问题是什么?