我正在尝试使用Hibernate在我的Java代码中创建两个模型之间的FK关系。根据表名,复合键的1个值是硬编码的。如何告诉Hibernate为此模型硬编码此值?
FK应验证相应表格(教师或高级教师)内的年龄组是否属于正确的组。例如,如果我尝试创建AGE为16的教师,则服务应拒绝该教师,因为16不是教师的有效年龄,如META_AGE_GROUP表中所示。但是,16是STUDENT表的有效年龄。
我试图简单地使用代码:
@Entity
@Table(name = "TEACHER")
public class Teacher {
@Id
private Long id;
@Column(name = "NAME")
private String name;
@OneToOne(mappedBy = "key.age")
private MetaAgeGroup age;
@Entity
@Table(name = "META_AGE_GROUP")
public class MetaAgeGroup {
@EmbeddedId
private MetaAgeGroupKey key;
@Column(name = "AGE_GROUP_DESC")
private String description;
@Embeddable
public class MetaAgeGroupKey implements Serializable {
private static final long serialVersionUID = -7130496764273819801L;
@Column(name = "AGE")
private Short age;
@Column(name = "AGE_GROUP_NAME")
private String group;
但是我得到了这个例外:
引用的属性不是(一个|多个)ToOne: mappedBy中的com.whee.school.jpa.model.MetaAgeGroup.key.age com.whee.school.jpa.model.Teacher.age
选择教师时是否有任何方法可以从数据库中取出Age,并通过提供与我选择的表名相等的MetaAgeGroup
将其映射到AGE_GROUP_NAME
FK而不放实际数据记录中的表名?更具体地说,我不想在TEACHER
表中放置一个存储值'Teacher'的列。我想在FK关系中使用表名本身。
这可能吗?
更新
如果我改变教师模型,如:
@Entity
@Table(name = "TEACHER")
public class Teacher {
@Id
private Long id;
@Column(name = "NAME")
private String name;
@OneToOne
@JoinColumns(value = {
@JoinColumn(name = "age", referencedColumnName = "AGE"),
@JoinColumn(name = "fk", referencedColumnName = "AGE_GROUP_NAME")})
private MetaAgeGroup age;
然后Hibernate没有将教师与MetaAgeGroup相关联的问题。但是,我的数据集中有一个包含表名的列;就像我想避免的那样。但这是我可以让我的应用程序进行编译的唯一方法。