更新后一对多关系为空值

问题描述 投票:0回答:1

我想与 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。可能是什么问题?

java spring-boot jpa one-to-many
1个回答
0
投票

您的 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);

双方在关系中的设置应与数据库中的内容相匹配,否则您会遇到问题。

© www.soinside.com 2019 - 2024. All rights reserved.