java - EclipseLink 中的@ManyToOne 映射问题
问题描述
我在使用此 @ManyToOne 地图时遇到问题,进行了很多搜索,但仍然找不到解决此问题的方法。
我有这两个类,我永远不会在 TB_MANUAL 中插入任何内容,我只会将其用作 TB_COMPANY 中 CD_MANUAL 字段的参考,如下所示:
Company company = new Company();
company.setManual("2"); //Theres already a row with this id in the TB_MANUAL
然后坚持公司,但我得到了这个错误:
Caused By: java.lang.IllegalStateException: During synchronization a new object was found through a relationship that was not marked cascade PERSIST: 2.
at org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork.discoverUnregisteredNewObjects(RepeatableWriteUnitOfWork.java:313)
at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.calculateChanges(UnitOfWorkImpl.java:723)
at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitToDatabaseWithChangeSet(UnitOfWorkImpl.java:1516)
at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.issueSQLbeforeCompletion(UnitOfWorkImpl.java:3168)
at org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork.issueSQLbeforeCompletion(RepeatableWriteUnitOfWork.java:355)
Truncated. see log file for complete stacktrace
-
@Entity
@Table(name = "TB_COMPANY", schema = "ADMPROD")
@Cacheable
public class Company implements Serializable {
private static final long serialVersionUID = 1L;
public Company() {}
public Company(String id) {
this.id = id;
}
@ManyToOne
@JoinColumn(name = "CD_MANUAL", referencedColumnName = "CD_MANUAL", nullable
= true)
private Manual manual;
public void setManual(String idManual) {
this.manual = new Manual(idManual);
}
}
和
@Entity
@Table(name = "TB_MANUAL")
public class Manual implements Serializable{
private static final long serialVersionUID = 1L;
public Manual() {
}
public Manual(String id) {
this.id = id;
}
@Id
@Column(name = "CD_MANUAL")
private String id;
@Column(name = "DS_OBS_MANUAL")
private String description;
}
解决方案
每次设置时都会创建新的 Manual,因此您的对象与 EntityManager 分离,或者根本没有数据。
我不争辩这是否是一个好的设计(尽管我从来不会那样做),要解决您的问题,您应该将CascadeType.PERSIST添加到您的关系中。
@ManyToOne
@JoinColumn(name = "CD_MANUAL", referencedColumnName = "CD_MANUAL", nullable
= true, cascade = CascadeType.PERSIST)
private Manual manual;
推荐阅读
- php - 在 foreach PHP Codeigniter 中调用存储过程
- javascript - 如何在提交时显示图像
- vue.js - 在 Vue 3 中将数据对象设置为来自 Promise 的值
- python - 无法找到列表的总和
- angular - 如何在 Angular 中获取异常消息
- typescript - TypeScript:如何合并使用相同全局属性的接口声明?
- javascript - 计数高于平均水平
- docker - 在 Docker 中连接到 vsftpd
- reactjs - lottie-web 使用 useRef typescript 设置容器值
- java - 如何使用三层架构和 SQL 服务器创建登录表单?