Hibernate Unidirectional OneToMany不使用复合ID

时间:2016-05-07 01:57:48

标签: java hibernate hibernate-onetomany

我一直在我的键盘上猛击头两天试图解决这个问题......

一些背景知识:我们使用Perl代码库设置数据模型,该代码库通过ODBC直接向数据库运行本机SQL语句。出于某些原因,我们决定用Java重写代码......我认为使用Hibernate定义所有映射是个好主意。我们不想编辑数据模型。

为简单起见,我只能用部分数据模型来表达问题。我们有实体" Job"," JobDatabase"和" JobTable"。

Job有一个job_name的PK。数据库具有job_name,name的PK。表具有job_name,src_database_name,name的PK。正如您所料,Job与JobDatabase有一个OneToMany关系,而Database有一个带有JobTable的OneToMany。

出于本次测试的目的,我从空表开始并尝试创建一些示例数据。我可以插入一个Job和一个JobDatabase,但是当我尝试插入JobTable时,Hibernate会抛出一个错误。或者更准确地说,这就是抱怨的地方。它没有开始执行我的代码,因为它检测到映射错误。但是,如果我删除JobDatabase和JobTable之间的关联,它将正确插入所有Job和JobDatabase记录而没有错误。

示例类(所有字段都有getter / setters ......还有许多其他字段):

@Entity
@Table(name="Job")
public class Job implements Serializable {
    @Id
    @Column(name="job_name",nullable = false)
    private String jobName;

    @OneToMany(cascade = CascadeType.ALL)
    @JoinColumn(name = "job_name", referencedColumnName = "job_name")
    private Set<JobDatabase> databases;
}

@Entity
@Table(name="JobDatabase")
public class JobDatabase implements Serializable {
    @Id
    @Column(name="job_name",nullable = false)
    private String jobName;

    @Id
    @Column(name="name",nullable = false)
    private String name;

    @OneToMany(cascade = CascadeType.ALL)
    @JoinColumns({
            @JoinColumn(name = "job_name", referencedColumnName = "job_name"),
            @JoinColumn(name = "name", referencedColumnName = "src_database_name")
    })
    private Set<JobTable> tables;
}

@Entity
@Table(name="JobTable")
public class JobTable implements Serializable{
    @Id
    @Column(name="job_name",nullable = false)
    private String jobName;

    @Id
    @Column(name="src_database_name",nullable = false)
    private String srcDatabaseName;

    @Id
    @Column(name="name",nullable = false)
    private String name;
}

错误:

Exception in thread "main" org.hibernate.MappingException: Unable to find column with logical name: src_database_name in JobDatabase

我一直收到这个错误。我不明白为什么它在实体中寻找引用的列&#34;拥有&#34;映射。 src_database_name确实只存在于JobTable中 - 它被称为&#34; name&#34;在JobDatabase中。 JobTable还有一个&#34;名称&#34;字段,但它指的是表的名称。

1 个答案:

答案 0 :(得分:0)

您需要在JobDatabase表中包含src_database_name列。或者您可以将src_database_name更改为其他列名。

对于复合键,引用列必须存在于源表中。