带有Hibernate和硬编码密钥的Java FK

时间:2017-10-04 14:06:32

标签: java hibernate jpa foreign-keys

我正在尝试使用Hibernate在我的Java代码中创建两个模型之间的FK关系。根据表名,复合键的1个值是硬编码的。如何告诉Hibernate为此模型硬编码此值?

Data Structure for Meta Data

Meta Data Overlap

Teacher Data Senior Teacher Data

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相关联的问题。但是,我的数据集中有一个包含表名的列;就像我想避免的那样。但这是我可以让我的应用程序进行编译的唯一方法。

Fk Column Added

0 个答案:

没有答案