首页 > 解决方案 > 如何在实体中正确使用映射以防止 Oracle 错误持续存在?

问题描述

我不是在 Java 中连接 Hibernate 实体的天才,所以这可能是一个非常微不足道的问题,但我现在真的很难,无法弄清楚如何解决这个问题......

我有一个 GENERATION 表和一个连接的 LIMIT_LIST。LIMIT_LIST 有元素,它们存储在第三个表中(不是真正相关的)。LIMIT_LIST 有一个 3 列的主键,这三列也在 GENERATION 表中表示并链接在一起以获得关系。

一个 Generation 元素可以在 Limit_list 表中有一个元素。

这是我的生成实体中的相关部分:

@ManyToOne(fetch=FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumns( {
    @JoinColumn(name="LIMIT_LIST_OBJID", referencedColumnName="OBJID", nullable=false, insertable=false, updatable=false),
    @JoinColumn(name="LIMIT_LIST_TY", referencedColumnName="LIMIT_LIST_TY", nullable=false, insertable=false, updatable=false),
    @JoinColumn(name="LIMIT_LIST_KIND_CV", referencedColumnName="LIMIT_LIST_KIND_CV", nullable=false, insertable=false, updatable=false) } )
private LimitList limitList;

Oracle 表中的相关外键:

Foreign Key
COLUMN_NAME         COLUMN_POSITION
LIMIT_LIST_OBJID    1
LIMIT_LIST_TY       2
LIMIT_LIST_KIND_CV  3

链接到:LIMIT_LIST 表

LimitList Entity 中的相关部分:

@OneToMany(mappedBy = "limitList", fetch = FetchType.EAGER)
private Set<Generation> generations = new HashSet<Generation>();

这具有三列作为主键:

COLUMN_NAME         COLUMN_POSITION
OBJID               1
LIMIT_LIST_TY       2
LIMIT_LIST_KIND_CV  3

我的问题:如果我在代码中连续调用:

EntityManager.persist(limitList);
EntityManager.persist(limitListElements);
EntityManager.persist(generation);

我得到 ORA-00001 异常。在我看来,Hibernate 尝试两次插入 limitList ......这就是 Oracle 给出主键错误的原因。

如果我删除 limitList 和 limitListElements persist 部分,因为我假设 Hibernate 会处理......

EntityManager.persist(generation);

我得到了这个 Oracle 异常:

ORA-02291

似乎没有任何效果,我不知道我在实体配置中做错了什么......你能帮帮我吗?谢谢 :)

PS .:这两个持久功能工作正常:

EntityManager.persist(limitList);
EntityManager.persist(limitListElements);

列表和元素的存储没有任何错误,当我尝试将列表与我的一代连接时出现问题......

编辑:

limitList 实体及其关系

@OneToMany(mappedBy = "limitList", fetch = FetchType.LAZY)
private Set<LimitListElement> elements = new HashSet<RestrictionListElement>();
   
@OneToMany(mappedBy = "limitList", fetch = FetchType.EAGER)
private Set<Generation> generations = new HashSetGeneration>();

编辑2:

这是limitList的compositeId:

@EmbeddedId
@AttributeOverrides( {
    @AttributeOverride(name="objId", column=@Column(name="OBJID", nullable=false, precision=22, scale=0) ),
    @AttributeOverride(name="limitListTy", column=@Column(name="LIMIT_LIST_TY", nullable=false, precision=22, scale=0) ),
    @AttributeOverride(name="limitListKindCv", column=@Column(name="LIMIT_LIST_KIND_CV", nullable=false, precision=22, scale=0) ) } )
private LimitListId id;

标签: javaoraclehibernate

解决方案


EntityManager.persist(generation);应该足以保持LimitList 。

您必须确保使用您传递的对象LimitList.generations填充填充:generation

Generation generation = // create Generation entity
LimitList limitList = // create LimitList entity

limitList.getGenerations().add(generation);
generation.setLimitList(limiList);

EntityManager.persist(generation);

不确定,limitListElements因为没有实体描述..


推荐阅读