繁体   English   中英

Hibernate单向OneToMany无法与复合ID一起使用

[英]Hibernate Unidirectional OneToMany Not Working with composite id

我已经在键盘上b了两天,试图找出答案...

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

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

Job的作业名称为PK。 数据库具有作业名,名称的PK。 表的PK为job_name,src_database_name,name。 如您所料,Job与JobDatabase具有OneToMany关系,而Database与JobTable具有OneToMany关系。

为了进行此测试,我从空表开始,尝试创建一些示例数据。 我可以插入Job和JobDatabase,但是当我尝试插入JobTable时,Hibernate会引发错误。 更准确地说,那就是它抱怨的地方。 它不会开始执行我的代码,因为它检测到映射错误。 但是,如果删除JobDatabase和JobTable之间的关联,它将正确插入所有Job和JobDatabase记录,没有错误。

样本类(所有字段都有getter / setter方法……还有许多其他字段):

@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

我不断收到此错误。 我不明白为什么它要在“拥有”映射的实体中查找引用的列。 src_database_name确实仅存在于JobTable中-在JobDatabase中被称为“名称”。 JobTable也有一个“名称”字段,但它引用表的名称。

您的JobDatabase表中需要有src_database_name列。 或者,您可以将src_database_name更改为其他列名。

对于复合键,您的源表中必须存在参考列。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM