【问题标题】:Problem with @ManyToOne map in EclipseLinkEclipseLink 中的@ManyToOne 映射问题
【发布时间】:2018-10-17 21:55:42
【问题描述】:

我在使用此 @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;

}

【问题讨论】:

    标签: java oracle jpa weblogic eclipselink


    【解决方案1】:

    每次设置时都会创建新的 Manual,因此您的对象与 EntityManager 分离,或者根本没有数据。

    我不争辩这是否是一个好的设计(尽管我从来不会那样做),为了解决您的问题,您应该将 CascadeType.PERSIST 添加到您的关系中。

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

    【讨论】:

    • 这个数据库搞砸了,我发现了问题,我通过json传递了manual的id,我们有一个API,我们需要持久化一个公司(通过json传递200列)我们通过manual: "1" 但是手动表的主键是 char(2),所以表中 id 1 上面有一个空格,通过 "1" 而不是 "1" 解决了"问题",谢谢您的回复。
    【解决方案2】:

    问题出在 Manual 表的主键中,JPA 没有找到任何 id 为 1 的行,因为 Manual 的主键是 char(2),传递“1”而不是“1”解决了问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-09
      • 2011-06-25
      • 1970-01-01
      • 1970-01-01
      • 2021-02-02
      • 2013-02-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多