JPA: для поля первичного ключа должно быть определено одно не доступное только для чтения отображение - PullRequest
0 голосов
/ 17 мая 2019

Я получаю ошибку 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 Ответ

2 голосов
/ 17 мая 2019

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

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

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

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