java - 如何在实体中正确使用映射以防止 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;
解决方案
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
因为没有实体描述..
推荐阅读
- java - 如何更新 ArrayList 中类实例的值
- php - MongoDB + PHP:过滤已解析的用户输入是否安全?
- python - 如何将请求的密码更改为名为`salt`和`pwdhash`的两个参数并将其保存到django中的数据库?
- shell - awk 根据匹配将列数据从一个文件输入到另一个文件
- javascript - 如何在类中调用构造函数内的方法
- python - 将一个不相关的行附加到 MySQL 查询
- markdown - Gitbook 代码块 - 是否可以显示行号,使其不总是以数字 1 开头?
- java - Memcached + SpringBoot 从常量文件中读取缓存键值
- android - 分页库 Callback.OnResult 不返回值到 Livedata
- python - 此版本的 ChromeDriver 仅支持 Chrome 版本 79 - Python