【发布时间】:2017-12-30 23:43:55
【问题描述】:
我有两个表,其架构如下:
表1
table1_id (pk)(整数)
名字
表2
table2_id (pk)(字符串)
table1_id (pk)(整数)
名字
我的代码是这样的
@Entity
@Table(name = "Table2")
class Table2 {
@Id
@Column(name = "table2_id")
private String id;
@Column(name="name")
private String name;
@OneToMany
@JoinColumn (name="table1_id")
private Set<Table1> table1Set = new HashSet<>();
//setters and getters
}
@Entity
@Table(name = "Table1")
class Table1 {
@Id
@Column(name = "table1_id")
private int id;
@Column(name="name")
private String name;
//setters and getters
}
现在当我查询时:Table2Repository.findById("One"):
我得到以下错误:
Hibernate: select table2.id as table2_id_1_, table2.name as name2_1_ from table2 table20_
Hibernate: select table10_.table1_id as table1_id1_1_0_, table1_.table1_id as table1_id1_0_0_, table10_.table1_id as table1_id1_0_1_, table10_.name as name2_0_1_ from table1 table10_ where table10_.table1_id=?
2017-07-25 12:53:11.352 WARN 11572 --- [ main] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 1722, SQLState: 42000
2017-07-25 12:53:11.352 ERROR 11572 --- [ main] o.h.engine.jdbc.spi.SqlExceptionHelper : ORA-01722: invalid number
似乎发生了一些不匹配。似乎使用字符串“table2_id”来查询Table1,它应该使用“table1_id”
请帮忙!
【问题讨论】:
-
您的映射中存在名称冲突:
Table2.table1Set上的@JoinColumn (name="table1_id")与Table1.id上的@Id @Column(name = "table1_id")。请注意,连接列进入Table1,不是Table2。 -
@crizzis ,我意识到连接列应该在“多”边表中,即。表格1 。然而,这个数据库模式是旧的,修改可能并不容易。无论如何,在不将连接列移动到 Table1 的情况下让它工作吗?谢谢。
-
我不认为我跟随。您如何与 one 侧的连接列建立 一对多 关联?当有多个
Table1关联到Table2时,您打算将它们的 id 存储在哪里? -
好的。让我试着用一个例子来解释更多。考虑两个表 Person 和 Phone Number。一个人可以有多个电话号码。人有 ID:person_id。电话表有 id Phone_num。现在从我目前对 OnetoMany 关系的理解来看,架构应该是这样的: PERSON: Person_id PHONE Phone_num Person_id 以上工作正常。但是,下面的架构不起作用。让我知道这是否可行。 : PERSON: Person_id Phone_num PHONE Phone_num
-
我知道您的意思是由
PERSON(person_id, phone_id)和PHONE_NUMBER(phone_id,phone_number)组成的架构。在这样的模式中,每个PERSON行只能在phone_id列中保存一个值,这意味着每个人最多可以有一个电话号码。假设PERSON表中有一个条目,其中phone_id引用了PHONE_NUMBER中的一个条目,并且您希望将另一个电话号码与该人关联。你打算怎么做?
标签: hibernate jpa orm spring-data-jpa hibernate-mapping