我一直在我的键盘上猛击头两天试图解决这个问题......
一些背景知识:我们使用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;字段,但它指的是表的名称。
答案 0 :(得分:0)
您需要在JobDatabase表中包含src_database_name列。或者您可以将src_database_name更改为其他列名。
对于复合键,引用列必须存在于源表中。