我想与 2 个不同的对象创建一对多关系。例如: 这里是A级
@Setter
@Getter
@Builder
@ToString
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "a")
public class A {
@Id
@Column(name = "id")
private String id;
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "id_a")
private List<B> firstValuesB;
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "id_a")
private List<B> secondValuesB;
}
这是我的B班
@Setter @Getter @Builder
@AllArgsConstructor @NoArgsConstructor
@Entity
@Table(name = "b", schema = "ibil")
public class B {
@Id
@Column(name = "id_b")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer idB;
@Column(name = "period_begin")
private Instant periodBegin;
@Column(name = "period_end")
private Instant periodEnd;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "id_a")
private A a;
}
在这里你可以看到我的桌子
CREATE TABLE `b` (
`id_b` int unsigned NOT NULL AUTO_INCREMENT,
`period_begin` datetime NOT NULL,
`period_end` datetime NOT NULL,
`type` varchar(25) DEFAULT NULL,
`id_a` varchar(36) DEFAULT NULL,
PRIMARY KEY (`id_b`),
KEY `fk_b_a` (`id_a`),
CONSTRAINT `fk_b_a` FOREIGN KEY (`id_a`) REFERENCES `a` (`id`)
);
当我用
aRepository.save(a)
保存 a 类时,第一次是正确的。当我更新 periodBegin 或 periodEnd 时,id_a 变为 null。可能是什么问题?
您的 A 实体多次错误地将“id_a”映射到 B 表中。假设您希望 B 实体保持原样,以便它引用 A,则 A 需要如下所示:
@Entity
@Table(name = "a")
public class A {
@Id
@Column(name = "id")
private String id;
@OneToMany(mappedBy="a", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
private List<B> firstValuesB;
}
现在,当您保存(a)时,您必须记住B.a控制外键并且必须设置,否则fk将为空:
A a = new A();
B b = new B();
b.setA(a);
a.setFirstValuesB(new ArrayList()).add(b);
save(a);
双方在关系中的设置应与数据库中的内容相匹配,否则您会遇到问题。