2017-07-25 113 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