gpt4 book ai didi

java - 在单向一对多关系中插入实体对象时出现问题

转载 作者:行者123 更新时间:2023-12-02 01:09:41 24 4
gpt4 key购买 nike

我有两个实体,每个实体都指向 Oracle 数据库中的一个表。这些实体属于在 Weblogic 下工作的 Spring/Maven/JPA/Hibernate Web 应用程序。

每个表的SQL定义如下:

CREATE TABLE "SUCVIRDASHBOARD"."NEON01_CAMPANIAS" ( 
"NEON01_ID" NUMBER NOT NULL ENABLE,
"NEON01_ID_NEON" VARCHAR2(50 BYTE) NOT NULL ENABLE,
"NEON01_TITULO" VARCHAR2(500 BYTE) NOT NULL ENABLE,
"NEON01_DESCRIPCION" VARCHAR2(3000 BYTE) NOT NULL ENABLE,
"NEON01_ID_IMAGEN" NUMBER NOT NULL ENABLE,
"NEON01_TERMINO_CONDICIONES" VARCHAR2(4000 BYTE),
"NEON01_URL_ACCION" VARCHAR2(4000 BYTE),
"NEON01_ACTIVADO" VARCHAR2(1 BYTE) NOT NULL ENABLE,
"NEON01_FECHA_MODIFICACION" DATE,
CONSTRAINT "NEON01_CAMPANIAS_PK" PRIMARY KEY ("NEON01_ID")
);

CREATE TABLE "SUCVIRDASHBOARD"."NEON02_CAMPANIA_CLIENTE" (
"NEON02_ID" NUMBER NOT NULL ENABLE,
"NEON02_RUT" NUMBER NOT NULL ENABLE,
"NEON02_PCS" VARCHAR2(50 BYTE) NOT NULL ENABLE,
"NEON01_ID" NUMBER NOT NULL ENABLE,
"NEON02_FECHA_CARGA" DATE NOT NULL ENABLE,
"NEON02_FECHA_DESPLIEGUE" DATE NOT NULL ENABLE,
"NEON02_FECHA_FINALIZACION" DATE NOT NULL ENABLE,
CONSTRAINT "NEON02_CAMPANIA_CLIENTE_PK" PRIMARY KEY ("NEON02_ID")
);

虽然没有外键,但 NEON01_CAMPANIAS 可以使用后一个表的 ID 与一个或多个 NEON02_CAMPANIA_CLIENTE 关联(这是一种单向关系)。基于此,我使用JPA为每个表定义了实体,如下所示:

@Entity
@Table(name="NEON01_CAMPANIAS")
public class NeonCampana {

@Id
@GenericGenerator(name = "generator", strategy = "increment")
@GeneratedValue(generator = "generator")
@Column(name="NEON01_ID")
private Long id;
/* More attributes, getters and setters */
}

@Entity
@Table(name="NEON02_CAMPANIA_CLIENTE")
public class NeonClienteCampana {
@Id
@GenericGenerator(name = "generator", strategy = "increment")
@GeneratedValue(generator = "generator")
@Column(name="NEON02_ID")
private Long id;

@OneToMany(fetch=FetchType.LAZY, orphanRemoval=true)
@Cascade({CascadeType.ALL})
@JoinColumn(name="NEON01_ID")
private List<NeonCampana> campanias;
/* More attributes, getters and setters */
}

我可以分别使用 Hibernate 的 Session 接口(interface)的 createCriteriasave 方法在 NEON01_CAMPANIAS 中毫无问题地进行选择和插入。但是,当我想使用以下代码在 campanias List 中保存 NeonClienteCampana 对象以及关联的 NeonCampana 对象时:

NeonClienteCampana cliente = new NeonClienteCampana();
cliente.setFechaCarga(hoy);
cliente.setFechaDespliegue(hoy);
cliente.setFechaFinalizacion(hoy);
cliente.setRut(item.getRut().longValue());
cliente.setPcs(item.getPcs());
List<NeonCampana> clienteCampanas = new ArrayList<>();
clienteCampanas.add(campanaDash);
cliente.setCampanias(clienteCampanas);
neonClienteService.guardar(cliente);

我收到以下错误消息:

错误:ORA-01400:无法在 ("SUCVIRDASHBOARD"."NEON02_CAMPANIA_CLIENTE"."NEON01_ID") 中插入 null

我尝试了 https://stackoverflow.com/a/3725194/2988946 中解释的以下解决方案

但是,当我部署应用程序时,出现以下异常:org.hibernate.MappingException:实体映射中的重复列:cl.clarochile.sucvirdashboard.dao.models.NeonCampana 列:NEON01_ID(应该是映射为 insert="false"update="false")

后来尝试了https://stackoverflow.com/a/34025677/2988946中的解决方案,但我遇到了同样的异常

鉴于这种情况,我该如何解决这个问题?提前致谢

最佳答案

发生这种情况是因为有两个属性指向同一列。例如,当您将 @OneToMany 映射为实体对象,然后添加另一个长对象作为键映射时。在这种情况下,hibernate 会感到困惑,并要求您将这些属性之一设置为不可变,因此它只能处理来自一侧的更新。您必须删除它或以这种方式使您的 @Column 不可变:

@Column(insertable = false, updatable = false)

关于java - 在单向一对多关系中插入实体对象时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57697822/

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