2017-07-25 86 views
0

我有架构两个表如下:单向JPA一对多映射 - ORA-01722:无效号码

表1

table1_id(PK)(整数)

名称

表2

table2_id(pk)(String)

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”

请帮忙!

+0

有一个名称冲突在映射:'@JoinColumn( (table1.id1)上的'table1_id')'与'Table1.id'上的'@Id @Column(name =“table1_id”)''。请注意,连接列进入'Table1',**而不是**'Table2'。 – crizzis

+0

@crizzis,我意识到连接列应该在“许多”旁边表中即。表格1 。然而,这个数据库模式是旧的,修改可能并不容易。无论如何,无需将连接列移动到Table1就可以工作?谢谢。 – Surbhi

+0

我不认为我遵循。你怎么能在* one *边上的连接列上有*一对多*关联?当有多个'Table1'与'Table2'关联时,您计划在哪里存储它们的ID? – crizzis

回答

0

映射中存在名称冲突:Table2.table1Set上的@JoinColumn (name="table1_id")Table1.id上的@Id @Column(name = "table1_id")。请注意,加入列进入Table1,而不是Table2

什么你大概的意思是这样的模式:PERSON(id, name, age, a_bunch_of_other_stuff)PERSON_PHONE_NUMBER(person_id, phone_id)PHONE_NUMBER(id, phone_number),在这种情况下,你的映射应如下所示:

@Entity 
@Table(name = "PERSON") 
public class Person { 

    @Id 
    private int id; 

    private String name; 
    ... 

    @OneToMany 
    @JoinTable(name = "PERSON_PHONE_NUMBER", 
     joinColumns = @JoinColumn(name = "PERSON_ID", referencedColumnName = "ID"), 
     inverseJoinColumns = @JoinColumn(name = "PHONE_ID", referencedColumnName = "ID") 
    ) 
    private Set<PhoneNumber> phoneNumbers; 
    ... 
} 

@Entity 
@Table(name = "PHONE_NUMBER") 
public class PhoneNumber { 

    @Id 
    private String id; 

    @Column(name = "PHONE_NUMBER") 
    private String phoneNumber; 
    ... 
} 
+0

感谢您的答案。在我的情况下,没有JoinTable:PERSON_PHONE_NUMBER(person_id,phone_id)。我的模式是这样的:PERSON(id(主键),phone_id(主键),名字,年龄,a_bunch_of_other_staff)和PHONE_NUMBER(id,phone_number)。 – Surbhi

+0

您描述的模式没有意义。这意味着每当一个人拥有多台电话时,该人的数据(姓名,年龄等)在“PERSON”表中被复制。除了在Person和PhoneNumber之间建立一对一的关系外,没有办法在JPA中映射这样的模式,并且接受这样一个事实,即对于一个真实的人来说存在多个Person实体 – crizzis

+0

当然,Phone和Person只是一个例子,所以看起来相同的数据是重复的。但是在我的情况下,对于两个Keys的不同排列,行具有不同的其他列的值。没有重复的数据在不同的行中。这实际上让我重新思考关系实际上是ManyToMany。将检查问题是否解决。谢谢! – Surbhi