JPA Исключение не-сущность как целевой объект в атрибуте отношения - PullRequest
0 голосов
/ 14 марта 2019

Я работаю над приложением, использующим JPA + Eclipselink, но получаю следующую ошибку:

[класс Domein.Activiteit] использует не-сущность [класс Domein.Lid] в качестве целевого объекта в атрибуте отношения [метод getDeelnemers]

Вот мой класс Activiteit (сокращенно):

@Entity
@Access(AccessType.PROPERTY)
public class Activiteit{
    private final SimpleLongProperty activiteitId = new SimpleLongProperty();
    private SimpleStringProperty naam = new SimpleStringProperty();
    private SimpleIntegerProperty maxAantalDeelnemers = new SimpleIntegerProperty();
    private SimpleObjectProperty<Date> startDatum = new SimpleObjectProperty<>();

    private SimpleObjectProperty<ActiviteitType> type = new SimpleObjectProperty<>();
    private SimpleObjectProperty<Date> eindDatum = new SimpleObjectProperty<>();;
    private SimpleObjectProperty<Date> uitersteInschrijving = new SimpleObjectProperty<>();;
    private SimpleObjectProperty<List<Lid>> deelnemers = new SimpleObjectProperty<>(new ArrayList<>());

    public Activiteit(){}

    public Activiteit(String naam, ActiviteitType type, int maxAantalDeelnemers, Date startDatum,
            Date eindDatum, Date uitersteInschrijving) {
        valideerData(startDatum, eindDatum, uitersteInschrijving);
        setNaam(naam);
        setActiviteitType(type);
        setMaxAantalDeelnemers(maxAantalDeelnemers);
        setStartDatum(startDatum);
        setEindDatum(eindDatum);
        setUitersteInschrijving(uitersteInschrijving);
    }

    public Activiteit(String naam, ActiviteitType type, int maxAantalDeelnemers, Date startDatum,
            Date eindDatum, Date uitersteInschrijving, List<Lid> deelnemers) {
        valideerData(startDatum, eindDatum, uitersteInschrijving);
        setNaam(naam);
        setActiviteitType(type);
        setMaxAantalDeelnemers(maxAantalDeelnemers);
        setStartDatum(startDatum);
        setEindDatum(eindDatum);
        setUitersteInschrijving(uitersteInschrijving);
        getDeelnemers().addAll(deelnemers);
    }

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public long getActiviteitId(){
        return this.activiteitId.get();
    }
    public LongProperty getActiviteitIdProperty(){
        return this.activiteitId;
    }

    // --------- THE OFFENDER ----------------------------------------------
    // ---------------------------------------------------------------------
    @ManyToMany
    @CascadeOnDelete
    public List<Lid> getDeelnemers(){
        return this.deelnemers.get();
    }
    public ObjectProperty<List<Lid>> getDeelnemersProperty(){
        return this.deelnemers;
    }
    public void setDeelnemers(List<Lid> deelnemers){
        // set List<Lid>
    }
    public void voegDeelnemerToe(Lid deelnemer) {
        // add Lid
    }

    public void verwijderDeelnemer(Lid deelnemer) {
        // remove Lid
    }

    @Column
    public String getNaam(){
        return this.naam.get();
    }
    public StringProperty getNaamProperty(){
        return this.naam;
    }
    public void setNaam(String naam){
        if(naam == null || naam.isBlank())
            throw new TekstNullLeegOfWhitespaceException("De naam moet ingevuld zijn.");
        this.naam.set(naam);
    }

    @Column
    @Enumerated
    public ActiviteitType getActiviteitType(){
        return this.type.get();
    }
    public ObjectProperty<ActiviteitType> getActiviteitTypeProperty(){
        return this.type;
    }
    public void setActiviteitType(ActiviteitType type){
        this.type.set(type);
    }

    @Column
    public int getMaxAantalDeelnemers(){
        return this.maxAantalDeelnemers.get();
    }
    public IntegerProperty getMaxAantalDeelnemersProperty(){
        return this.maxAantalDeelnemers;
    }
    public void setMaxAantalDeelnemers(int maxAantalDeelnemers){
        if(maxAantalDeelnemers <= 0)
            throw new MaxAantalDeelnemersNulofNegatiefException("Maximaal aantal deelnemers moet minstens 1 zijn!");
        this.maxAantalDeelnemers.set(maxAantalDeelnemers);
    }
    @Column
    @Temporal(TemporalType.DATE)
    public Date getStartDatum(){
        return this.startDatum.get();
    }
    public ObjectProperty<Date> getStartDatumProperty(){
        return this.startDatum;
    }
    public void setStartDatum(Date startDatum) throws DatumReedsVoorbijException{
        valideerData(startDatum, this.getEindDatum(), this.getUitersteInschrijving());
        this.startDatum.set(startDatum);
    }
    @Column
    @Temporal(TemporalType.DATE)
    public Date getEindDatum(){
        return this.eindDatum.get();
    }
    public ObjectProperty<Date> getEindDatumProperty(){
        return this.eindDatum;
    }
    public void setEindDatum(Date eindDatum) throws DatumReedsVoorbijException{        
        valideerData(this.getStartDatum(), eindDatum, this.getUitersteInschrijving());
        this.eindDatum.set(eindDatum);
    }
    @Column
    @Temporal(TemporalType.DATE)
    public Date getUitersteInschrijving(){
        return this.uitersteInschrijving.get();
    }
    public ObjectProperty<Date> getUitersteInschrijvingProperty(){
        return this.uitersteInschrijving;
    }
    public void setUitersteInschrijving(Date uitersteInschrijving) throws DatumReedsVoorbijException{
        valideerData(this.getStartDatum(), this.getEindDatum(), uitersteInschrijving);
        this.uitersteInschrijving.set(uitersteInschrijving);
    }        
    public boolean isVolzet(){
        return getDeelnemers().size() == getMaxAantalDeelnemers();
    }
    private void valideerData(Date startDatum, Date eindDatum,
            Date uitersteInschrijving) throws DatumReedsVoorbijException {
        // validation
    }
}

Вот класс Lid:

@Entity
@Access(AccessType.PROPERTY)
public class Lid {
    private final SimpleLongProperty lidId = new SimpleLongProperty();
    private SimpleLongProperty huisnummer = new SimpleLongProperty();
    private SimpleStringProperty voornaam = new SimpleStringProperty();
    private SimpleStringProperty familienaam = new SimpleStringProperty();
    private SimpleStringProperty gebruikersnaam = new SimpleStringProperty();
    private SimpleStringProperty wachtwoord = new SimpleStringProperty();
    private SimpleStringProperty straatnaam = new SimpleStringProperty();
    private SimpleStringProperty vastTelefoonNummer = new SimpleStringProperty();
    private SimpleStringProperty gsmNummer = new SimpleStringProperty();
    private SimpleStringProperty email = new SimpleStringProperty();
    private SimpleStringProperty emailOuders = new SimpleStringProperty();
    private SimpleObjectProperty<LidType> type = new SimpleObjectProperty<>();
    private SimpleObjectProperty<Date> geboortedatum = new SimpleObjectProperty<>();
    private SimpleObjectProperty<Date> inschrijvingsdatum = new SimpleObjectProperty<>();
    private SimpleObjectProperty<Formule> formule = new SimpleObjectProperty<>();
    private SimpleObjectProperty<Graad> graad = new SimpleObjectProperty<>();
    private SimpleObjectProperty<Geslacht> geslacht = new SimpleObjectProperty<>();
    private SimpleIntegerProperty punten = new SimpleIntegerProperty(0);
    private SimpleBooleanProperty infoClub = new SimpleBooleanProperty();
    private SimpleBooleanProperty infoFederaal = new SimpleBooleanProperty();    
    private SimpleLongProperty postcode = new SimpleLongProperty();
    private SimpleStringProperty stad = new SimpleStringProperty();
    private SimpleStringProperty nationaliteit = new SimpleStringProperty();
    private SimpleStringProperty geboortePlaats = new SimpleStringProperty();

    private DojoClub dojo;

    public Lid(){}

    public Lid(LidDto lidDto) throws NoSuchAlgorithmException, InvalidKeySpecException {
                setHuisnummer(lidDto.getHuisnummer());
                setVoornaam(lidDto.getVoornaam());
                setFamilienaam(lidDto.getFamilienaam());
                setGebruikersnaam(lidDto.getGebruikersnaam());
                setWachtwoord("");
                setStraatnaam(lidDto.getStraatnaam());
                setVastTelefoonNummer(lidDto.getVastTelefoonNummer());
                setGsmNummer(lidDto.getGsmNummer());
                setEmail(lidDto.getEmail());
                setEmailOuders(lidDto.getEmailOuders());
                setGeboortedatum(lidDto.getGeboortedatum());
                setInschrijvingsdatum(Calendar.getInstance().getTime());
                setType(lidDto.getType());
                setFormule(lidDto.getFormule());
                setGraad(lidDto.getGraad());
                setGeslacht(lidDto.getGeslacht());
                setInfoClub(lidDto.getInfoClub());
                setInfoFederaal(lidDto.getInfoFederaal());
                setPunten(0);
                setPostcode(lidDto.getPostcode());
                setStad(lidDto.getStad());
                setNationaliteit(lidDto.getNationaliteit());
                setGeboorteplaats(lidDto.getGeboorteplaats());         
    }

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public long getLidId(){
        return this.lidId.get();
    }
    public LongProperty getLidIdProperty(){
        return this.lidId;
    }
    /*
    private void setLidId(long id){
        this.lidId.set(id);
    }*/

    @Column
    public long getPostcode(){
        return this.postcode.get();
    }
    public LongProperty getPostcodeProperty(){
        return this.postcode;
    }
    private void setPostcode(long postcode){
        this.postcode.set(postcode);
    }

    @Column
    public String getStad(){
        return this.stad.get();
    }
    public StringProperty getStadProperty(){
        return this.stad;
    }
    private void setStad(String stad){
        this.stad.set(stad);
    }

    @Column
    public String getNationaliteit(){
        return this.nationaliteit.get();
    }
    public StringProperty getNationaliteitProperty(){
        return this.nationaliteit;
    }
    private void setNationaliteit(String nationaliteit){
        this.nationaliteit.set(nationaliteit);
    }

    @Column
    public String getGeboorteplaats(){
        return this.geboortePlaats.get();
    }
    public StringProperty getGeboorteplaatsProperty(){
        return this.geboortePlaats;
    }
    private void setGeboorteplaats(String geboortePlaats){
        this.geboortePlaats.set(geboortePlaats);
    }

    @Column
        public long getHuisnummer(){
        return this.huisnummer.get();
    }
    public LongProperty getHuisnummerProperty(){
        return this.huisnummer;
    }
    private void setHuisnummer(long huisnummer){
        this.huisnummer.set(huisnummer);
    }

    @Column
    public String getFamilienaam(){
        return this.familienaam.get();
    }
    public StringProperty getFamilienaamProperty(){
        return this.familienaam;
    }
    public void setFamilienaam(String familienaam){
        this.familienaam.set(familienaam);
    } 

    @Column
    public String getVoornaam(){
        return this.voornaam.get();
    }
    public StringProperty getVoornaamProperty(){
        return this.voornaam;
    }
    public void setVoornaam(String voornaam){
        this.voornaam.set(voornaam);
    }  

    @Column(unique=true)
    public String getGebruikersnaam(){
        return this.gebruikersnaam.get();
    }
    public StringProperty getGebruikersnaamProperty(){
        return this.gebruikersnaam;
    }
    public void setGebruikersnaam(String gebruikersnaam){
        this.gebruikersnaam.set(gebruikersnaam);
    }

    @Column
    public String getWachtwoord(){
        return this.wachtwoord.get();
    }
    public StringProperty getWachtwoordProperty(){
        return this.wachtwoord;
    } 
    public void setWachtwoord(String ww) throws NoSuchAlgorithmException, InvalidKeySpecException{
        this.wachtwoord.set(generatePassword());
    }

    @Column
    public String getStraatnaam(){
        return this.straatnaam.get();
    }
    public StringProperty getStraatnaamProperty(){
        return this.straatnaam;
    }
    public void setStraatnaam(String straatnaam){
        this.straatnaam.set(straatnaam);
    }

    @Column
    public String getVastTelefoonNummer(){
        return this.vastTelefoonNummer.get();
    }
    public StringProperty getVastTelefoonNummerProperty(){
        return this.vastTelefoonNummer;
    } 
    public void setVastTelefoonNummer(String nummer){
        valideerCommunicatiemiddel(nummer, Communicatiemiddel.TELEFOON);
        this.vastTelefoonNummer.set(nummer);
    }

    @Column
    public String getGsmNummer(){
        return this.gsmNummer.get();
    }
    public StringProperty getGsmNummerProperty(){
        return this.gsmNummer;
    } 
    public void setGsmNummer(String nummer){
        valideerCommunicatiemiddel(nummer, Communicatiemiddel.GSM);
        this.gsmNummer.set(nummer);
    }

    @Column
    public String getEmail(){
        return this.email.get();
    }
    public StringProperty getEmailProperty(){
        return this.email;
    } 
    public void setEmail(String email){       
        valideerCommunicatiemiddel(email, Communicatiemiddel.EMAIL);
        this.email.set(email);
    }

        @Column
    public String getEmailOuders(){
        return this.emailOuders.get();
    }
    public StringProperty getEmailOudersProperty(){
        return this.emailOuders;
    } 
    public void setEmailOuders(String email){
        valideerCommunicatiemiddel(email, Communicatiemiddel.EMAIL);
        this.emailOuders.set(email);
    }

    @Column
    @Enumerated
    public LidType getType(){
        return this.type.get();
    }
    public ObjectProperty<LidType> getTypeProperty(){
        return this.type;
    }
    public void setType(LidType type){
        this.type.set(type);
    }

    @Column
    @Temporal(TemporalType.DATE)
    public Date getGeboortedatum(){
        return geboortedatum.get();
    }
    public ObjectProperty<Date> getGeboortedatumProperty(){
        return this.geboortedatum;
    }    
    public void setGeboortedatum(Date geboortedatum){
        this.geboortedatum.set(geboortedatum);
    }

    @Column
    @Temporal(TemporalType.DATE)
    public Date getInschrijvingsdatum(){
        return inschrijvingsdatum.get();
    }
    public ObjectProperty<Date> getInschrijvingsdatumProperty(){
        return this.inschrijvingsdatum;
    }    
    public void setInschrijvingsdatum(Date inschrijvingsdatum){
        this.inschrijvingsdatum.set(inschrijvingsdatum);
    }

    @Column
    @Enumerated
    public Formule getFormule(){
        return this.formule.get();
    }
    public ObjectProperty<Formule> getFormuleProperty(){
        return this.formule;
    }
    public void setFormule(Formule formule){
        this.formule.set(formule);
    }

    @Column
    @Enumerated
    public Graad getGraad(){
        return this.graad.get();
    }
    public ObjectProperty<Graad> getGraadProperty(){
        return this.graad;
    }
    public void setGraad(Graad graad){
        this.graad.set(graad);
    }

    @Column
    @Enumerated
    public Geslacht getGeslacht(){
        return this.geslacht.get();
    }
    public ObjectProperty<Geslacht> getGeslachtProperty(){
        return this.geslacht;
    }
    public void setGeslacht(Geslacht geslacht){
        this.geslacht.set(geslacht);
    }


    @Column
    public int getPunten(){
        /*!*!*!*TODO*!*!*!* systeem van punten berekenen uitwerken */
        return this.punten.get();
    }
    public IntegerProperty getPuntenProperty(){
        return this.punten;
    }
    public void setPunten(int punten){
        this.punten.set(punten);
    }

    @Column
    public boolean getInfoClub(){
        return this.infoClub.get();
    }
    public SimpleBooleanProperty getInfoClubProperty(){
        return this.infoClub;
    }
    public void setInfoClub(boolean infoClub){
        this.infoClub.set(infoClub);
    }

    @Column
    public boolean getInfoFederaal(){
        return this.infoFederaal.get();
    }
    public SimpleBooleanProperty getInfoFederaalProperty(){
        return this.infoFederaal;
    }
    public void setInfoFederaal(boolean infoFederaal){
        this.infoFederaal.set(infoFederaal);
    }

    protected static void valideerCommunicatiemiddel(String teValideren,
            Communicatiemiddel optie) throws CommunicatiemiddelOngeldigException {
        // validation
    } 

    private String generatePassword() throws InvalidKeySpecException, NoSuchAlgorithmException{
        // code
    }   

    public enum Communicatiemiddel{
        EMAIL,
        GSM,
        TELEFOON;
    }
}

Вот файл persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
  <persistence-unit name="taijitanPU" transaction-type="RESOURCE_LOCAL">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <class>domein.Lid</class>
    <class>domein.Activiteit</class>
    <properties>
      <property name="javax.persistence.jdbc.url" value="jdbc:sqlserver://[...].[...].rds.amazonaws.com:1234;databaseName=[...]DB"/>
      <property name="javax.persistence.jdbc.user" value="MasterAdmin"/>
      <property name="javax.persistence.jdbc.driver" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/>
      <property name="javax.persistence.jdbc.password" value="[password]"/>
    </properties>
  </persistence-unit>
</persistence>

Я уже попробовал все предложенное здесь , но, похоже, ничего не работает.

Код сломался, когда я внес некоторые коррективы в валидацию сеттеров, добавил перечисление Communicatiemiddel в Lid ... Я не могу себе представить, что что-то сломалось.

Кто-нибудь знает, что еще мне не хватает?

...