JPA: для поля первичного ключа должно быть определено одно не доступное только для чтения отображение

Я получаю An internal error occurred accessing the primary key object [class domein.PersoonSessieKey]. Internal Exception: java.lang.NoSuchMethodException: domein.PersoonSessieKey.getPersoon() An internal error occurred accessing the primary key object [class domein.PersoonSessieKey]. Internal Exception: java.lang.NoSuchMethodException: domein.PersoonSessieKey.getPersoon() ошибка при попытке запустить мое приложение. Я смотрел на подобные вопросы, но не могу понять, что я делаю неправильно.

Я пытался использовать Embeddable, но так как я понятия не имел, что я делал, это также приводило к ошибке, которая заставила меня попробовать ClassId. Однако теперь я также получаю сообщение об ошибке и понятия не имею, что его вызывает.

Класс сущности

 @Entity @Access(AccessType.PROPERTY) @IdClass(PersoonSessieKey.class) @Table(name = "PersoonSessie") public class ClubPersoonSessie implements Serializable { private ClubSessie sessie; private ClubPersoon persoon; @Id @ManyToOne(cascade = CascadeType.PERSIST) @JoinColumn(name = "SessieId") public ClubSessie getSessie() { return sessie; } public void setSessie(ClubSessie sessie) { this.sessie = sessie; } @Id @ManyToOne(cascade = CascadeType.PERSIST) @JoinColumn(name = "PersoonId") public ClubPersoon getPersoon() { return persoon; } public void setPersoon(ClubPersoon persoon) { this.persoon = persoon; } public ClubPersoonSessie() { } } 

Класс первичного ключа

 public class PersoonSessieKey implements Serializable { private int persoonId; private int sessieId; public int getPersoonId() { return persoonId; } public int getSessieId() { return sessieId; } public PersoonSessieKey(int persoonId, int sessieId) { this.persoonId = persoonId; this.sessieId = sessieId; } public PersoonSessieKey() { } @Override public int hashCode() { int hash = 5; hash = 89 * hash + this.persoonId; hash = 89 * hash + this.sessieId; return hash; } @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } final PersoonSessieKey other = (PersoonSessieKey) obj; if (this.persoonId != other.persoonId) { return false; } if (this.sessieId != other.sessieId) { return false; } return true; } } 

Всего 1 ответ


Свойства IdClass должны соответствовать полям, @Id в вашей сущности. Это явно не тот код, который вы опубликовали.

domein.PersoonSessieKey.getPersoon() ожидается (и не найден), так как у вас есть свойство persoon помеченное Id

Чтобы заставить это работать с подходом idclass

  • добавьте к объекту те же поля, что и в idclass, и аннотируйте их с помощью @Id
  • удалить @Id из отношений
  • помечать отношения как не обновляемые и не вставляемые (для решения проблемы из заголовка записи, то есть нескольких полей с возможностью записи, сопоставленных одному и тому же столбцу)

Есть идеи?

10000