【问题标题】:Unidirectional JPA OnetoMany Mapping - ORA-01722: invalid number单向 JPA OnetoMany 映射 - ORA-01722:无效编号
【发布时间】: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


【解决方案1】:

您的映射中存在名称冲突:@JoinColumn (name="table1_id") 上的 Table2.table1Set@Id @Column(name = "table1_id") 上的 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;
    ...
}

【讨论】:

  • 感谢您的回答。就我而言,没有 JoinTable : PERSON_PHONE_NUMBER(person_id, phone_id) 。我的架构是这样的:PERSON(id (primary key) , phone_id (primary key),name, age, a_bunch_of_other_staff) 和 PHONE_NUMBER(id, phone_number)。
  • 您描述的架构没有意义。这意味着每当一个人拥有不止一部手机时,该人的数据(姓名、年龄等)就会在PERSON 表中重复。除了在 PersonPhoneNumber 之间建立一对一的关系之外,没有办法在 JPA 中映射这样的模式,并且接受一个事实,即单个实际人员将存在多个 Person 实体
  • 当然,Phone 和 Person 只是示例,因此看起来相同的数据是重复的。但是在我的情况下,对于两个 Key 的不同排列,行具有其他列的不同值。在不同的行中没有重复数据。这实际上让我重新思考关系实际上是ManyToMany。将检查问题是否解决。谢谢!
猜你喜欢
  • 2014-04-14
  • 1970-01-01
  • 2019-08-09
  • 2016-08-19
  • 2023-03-15
  • 2020-05-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多