Hibernate 单向JPA OnetoMany映射-ORA-01722:无效数字

Hibernate 单向JPA OnetoMany映射-ORA-01722:无效数字,hibernate,jpa,orm,spring-data-jpa,hibernate-mapping,Hibernate,Jpa,Orm,Spring Data Jpa,Hibernate Mapping,我有两个具有模式的表,如下所示: 表1 表1_id(pk)(整数) 名字 表2 表2_id(pk)(字符串) 表1_id(pk)(整数) 名字 我的代码如下所示 @Entity @Table(name = "Table2") class Table2 { @Id @Column(name = "table2_id") private String id; @Column(name="name") private String name;

我有两个具有模式的表,如下所示:

表1

表1_id(pk)(整数)

名字

表2

表2_id(pk)(字符串)

表1_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
}
似乎出现了一些不匹配的情况。它似乎在使用字符串“table2\u id”来查询Table1,其中应该使用“Table1\u id”


请帮忙

映射中存在名称冲突:
Table2.table1Set上的
@JoinColumn(name=“table1\u id”)
table1.id上的
@id@Column(name=“table1\u id”)
。请注意,联接列进入
表1
而不是
表2

您可能的意思是这样的模式:
个人(id、姓名、年龄、一堆其他东西)
个人电话号码(PERSON\u id、PHONE\u id)
电话号码(id、PHONE\u 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;
    ...
}
@实体
@表(name=“PERSON”)
公共阶层人士{
@身份证
私有int-id;
私有字符串名称;
...
@独身癖
@JoinTable(name=“PERSON\u PHONE\u NUMBER”,
joinColumns=@JoinColumn(name=“PERSON\u ID”,referencedColumnName=“ID”),
inverseJoinColumns=@JoinColumn(name=“PHONE\u ID”,referencedColumnName=“ID”)
)
私人电话号码;
...
}
@实体
@表(name=“电话号码”)
公共类电话号码{
@身份证
私有字符串id;
@列(name=“电话号码”)
私有字符串电话号码;
...
}

映射中存在名称冲突:
@JoinColumn(name=“table1\u id”)
Table2.table1Set
vs
@id@Column(name=“table1\u id”)
table1.id
上。注意,join列进入
表1
,而不是
表2
@crizzis,我意识到join列应该在“多”边表中,即表1。但是,此数据库模式很旧,修改可能不容易。在不将联接列移动到表1的情况下,是否仍然可以使其工作?谢谢。我想我没听懂。如何与一侧的联接列建立一对多关联?当有多个
表1
表2
关联时,您计划将其ID存储在哪里?确定。让我试着用一个例子来解释更多。考虑两个表的人和电话号码。一个人可以有多个电话号码。person有Id:person\u Id。Phone table有Id Phone\u num。现在根据我到目前为止对OnetoMany关系的理解,模式应该是:person:person\u Id Phone\u num person\u Id上面的工作正常。但是,下面的架构不起作用。请告诉我这是否可行:PERSON:PERSON\u id Phone\u num Phone\u num我理解您的意思是由
PERSON(PERSON\u id,Phone\u id)
Phone\u NUMBER(Phone\u id,Phone\u NUMBER)
组成的模式。在这种模式中,每个
PERSON
行只能在
phone\u id
列中保存一个值,这意味着每个人最多只能有一个电话号码。假设
PERSON
表中有一个条目,其
phone\u id
引用了
phone\u NUMBER
中的条目,并且您希望将另一个电话号码与该人员关联。你打算怎么做?谢谢你的回答。在我的情况下,没有可连接的:PERSON\u PHONE\u NUMBER(PERSON\u id,PHONE\u id)。我的模式是这样的:个人(id(主键)、电话号码(主键)、姓名、年龄、一群其他员工)和电话号码(id、电话号码)。你描述的模式没有意义。这意味着每当一个人有多部手机时,该人的数据(姓名、年龄等)就会在
person
表中重复。在JPA中,除了在
Person
PhoneNumber
之间建立一对一的关系之外,没有其他方法可以映射这样的模式,而且,接受这样一个事实,即一个实际的个人将存在多个
Person
实体。当然,Phone和Person只是一个例子,因此可能看起来相同的数据是重复的。然而,在我的例子中,对于两个键的不同排列,行具有其他列的不同值。在不同的行中没有重复的数据。这实际上让我重新思考这种关系实际上是很多的。将检查问题是否解决。谢谢
@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;
    ...
}