«отображение не только для чтения, определенное для поля первичного ключа» - PullRequest
1 голос
/ 03 декабря 2011

И я создал объекты из tableA, tableB, tableC из моей базы данных.

tableA имеет внешний ключ для tableB и имеет однонаправленное отношение «многие к одному».tableC имеет два первичных ключа, и один из них является внешним ключом первичного ключа в tableA.tableC также имеет однонаправленное отношение «многие к одному» с tableA.

Затем я создал сессионный компонент и элемент управления данными из него, в окне разработки создал таблицу только для чтения из tableA.

И я выбрал столбцы в tableA, а также в tableB.

Я запустил приложение и увидел следующее исключение в окне журнала.

Local Exception Stack: Исключение [EclipseLink-46] (Eclipse Persistence Services - 2.1.3.v20110304-r9073): org.eclipse.persistence.exceptions.DescriptorException Исключение Описание: Для поля первичного ключа должно быть определено одно не доступное только для чтения отображение [tableC.tableA_ID].Дескриптор: RelationalDescriptor (mypack.tableC -> [DatabaseTable (tableC)])

tableA_ID является первичным ключом в tableA.

Как я могу решить эту ошибку

Ответы [ 2 ]

4 голосов
/ 03 декабря 2011

Пожалуйста, отправьте код для @Entity классов.

Однако лучше всего предположить, что у вас есть столбец tableA_ID на tableC в двух отдельных сопоставлениях, один раз как часть @ManyToOne и снова как поле (возможно, как часть @EmbeddedId). JPA позволяет вам управлять базовым столбцом только через одно отображаемое сопоставление.

Если вам нужны оба сопоставления, вам нужно выбрать, какое из них вы будете использовать для записи , и обозначить другое как доступное только для чтения с insertable=false, updatable=false.

Например:

@Entity
pubilc class TableC {

  // read-write mapping to manage via relationship 
  @ManyToOne(column="tableA_ID")
  private TableA tableA;

  // read-only convenience method to get ID directly w/o navigating relationship
  @Column(name="tableA_ID", insertable=false, updatable=false)
  private Long tableA_ID;
}
0 голосов
/ 03 декабря 2011

[pedant] Я полагаю, что под «tableC есть два первичных ключа» вы подразумеваете «tableC имеет первичный ключ, состоящий из двух столбцов». [/ Pedant]

«Затем я создал сессионный компонент и элемент управления даннымииз него в окне разработки была создана таблица только для чтения из таблицы A. "

Означает ли это, что вы пометили бин, отображенный для таблицы A, как глобально доступный только для чтения?Если это так, в зависимости от сопоставления вы можете столкнуться с тем же, что и здесь , где EclipeLink заключает, что невозможно создать новый объект, поскольку он зависит от объекта только для чтения.

...