繁体   English   中英

在单向一对多关系中插入实体对象的问题

[英]Problem with inserting entity object in unidirectional One to Many relationship

我有两个实体,每个实体都指向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")
);

尽管没有外键,但可以使用后者的表ID将NEON01_CAMPANIAS与一个或多个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接口的createCriteriasave方法选择并插入NEON01_CAMPANIAS,而不会出现问题。 但是,当我要救一个NeonClienteCampana对象关联NeonCampana中的对象campanias List使用下面的代码:

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

我收到以下错误消息:

ERROR: ORA-01400: Cannot insert null in ("SUCVIRDASHBOARD"."NEON02_CAMPANIA_CLIENTE"."NEON01_ID")

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

但是,当我部署应用程序时,出现以下异常: org.hibernate.MappingException:Repeated column in mapping for entity: cl.clarochile.sucvirdashboard.dao.models.NeonCampana column: NEON01_ID (should be mapped with insert="false" update="false")

之后,我在https://stackoverflow.com/a/34025677/2988946中尝试了该解决方案,但出现了相同的异常

在这种情况下,我该如何解决? 提前致谢

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

@Column(insertable = false, updatable = false)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM