Проблема с картой @ManyToOne в EclipseLink - PullRequest
0 голосов
/ 18 октября 2018

У меня проблемы с этой картой @ManyToOne, я много искал, но все еще не могу найти решение этой проблемы.

У меня есть эти два класса, я никогда ничего не вставлю в TB_MANUAL,я просто буду использовать его как ссылку для поля CD_MANUAL в TB_COMPANY, например:

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;

}

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Проблема была в первичном ключе таблицы Manual, JPA не находит ни одной строки с идентификатором 1, потому что первичным ключом Manual является char (2), и передача "1" вместо "1" решила проблему.

0 голосов
/ 18 октября 2018

Вы создаете новое Руководство каждый раз, когда устанавливаете его, поэтому ваш объект отсоединяется от EntityManager или вообще не имеет данных.

Я не спорю, хороший ли это дизайн (хотя яникогда бы не сделал это так), чтобы преодолеть вашу проблему, вы должны добавить CascadeType.PERSIST к вашему отношению.

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