gpt4 book ai didi

java - Hibernate:在不实际使用任何主/外键关系的情况下使用 OneToMany

转载 作者:行者123 更新时间:2023-11-29 03:47:52 25 4
gpt4 key购买 nike

我看了几百个帖子,和我的不一样:(

请考虑以下情况。

Mysql 模式:

create table parent(
id int,
col1 int,
col2 int,
primary key(id)
)

create table child(
id int,
col1 int,
col2 int,
primary key(id)
)

请注意,父表和子表之间没有显式/键关系。

现在,我想要的是在获取“parent”的同时获取所有具有相同“col1”和“col2”值的“child”对象[单向映射就足够了]。

我尝试过的一些 Hibernate 实体,

@Entity
public class parent{

@Id
private int id;

@Column
private int col1;

@Column
private int col2;

@OneToMany
@JoinColumns({
@JoinColumn(name = "col1"),
@JoinColumn(name = "col2")
})
private List<Child> children;

/**
Other logic goes here..
**/

}

子实体为,

@Entity
public class Child{

@Id
private int id;

@Column
private int col1;

@Column
private int col2;

/**
Other logic goes here..
**/
}

结果:Hibernate 错误报告“A Foreign key referenceing 'Child' from 'Parent' has the wrong number of column. should be 1”

我将此解释为,@JoinColumn 必须仅使用“id”完成

问题:

1) hibernate 的所有@OneToMany @ManyToOne 等是否都需要在表之间/在实体中显式/键引用[由@Id 注释]?

2) 我应该怎么做才能达到这个目的?

最佳答案

这里表A和表B是一对多的关系,即表A中的一条记录可以在表B中有多条记录。由于 TableA 中的 col1 在 TableB 的 col1 中被引用为外键。以下 JPA 代码成功获取所有结果。

DROP table x.TableA;
CREATE TABLE x.TableA (
Id BIGINT IDENTITY(1,1) NOT NULL,
col1 varchar(30) NOT NULL,
CONSTRAINT PK_col1 PRIMARY KEY(col1)
);

DROP table x.TableB;
CREATE TABLE x.TableB (
Id BIGINT IDENTITY(1,1)NOT NULL,
col1 varchar(30) NOT NULL,
col2 varchar(10) NULL
);

ALTER TABLE x.TableB
ADD CONSTRAINT FK_TableB_col1 FOREIGN KEY (col1)
REFERENCES x.TableA (col1)
;

@Entity
@Table(name = "TableA", schema = "x")
public class ClassA implements Serializable {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Column(name = "col1")
private String col1;


@OneToMany(
cascade = {CascadeType.ALL},
orphanRemoval = true,
fetch = FetchType.EAGER)
@JoinColumn(name = "col1", referencedColumnName = "col1")
private List<ClassB> objB = new ArrayList<>();
}

----------------------------------


@Entity
@Table(name = "TableB", schema = "x")
public class ClassB implements Serializable {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Column(name = "col1")
private String col1;

@Column(name = "col2")
private String col2;

}

关于java - Hibernate:在不实际使用任何主/外键关系的情况下使用 OneToMany,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35459348/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com