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

每次设置时都会创建新的手册,因此您的对象与实体管理器分离,或者根本没有数据。

我不认为这是否是一个好的设计(尽管我从来没有这样做过(,为了克服你的问题,你应该将CascadeType.PERSIST添加到你的关系中。

@ManyToOne
@JoinColumn(name = "CD_MANUAL", referencedColumnName = "CD_MANUAL", nullable 
= true, cascade = CascadeType.PERSIST)
private Manual manual;

问题出在手动表主键中,JPA 找不到任何 id 为 1 的行,因为手动的主键是 char(2(,传递"1"而不是"1"解决了问题。

最新更新