[英]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.