/*
 * JPA entity template
 *
 *
 * Takatuka - Template fuer JPA2 Entitaeten (inklusive Bean Validation)
 *
 * Moeglichkeiten und Einschraenkungen:
 * - Beziehungen werden abgebildet
 * -- es gibt keine 1:1 Beziehungen
 * -- N:M Beziehungen sind immer bidirektional
 * - Vererbung wird nicht unterstuetzt
 * - Support für CustomData
 */
package de.ivu.elect.business.kandidatur.entity;

@javax.persistence.NamedQueries(
 {



   
      @javax.persistence.NamedQuery(
     name="KANDIDATUR.All",
     query="SELECT o FROM Kandidatur o",
     hints = {@javax.persistence.QueryHint(name = "org.hibernate.cacheable", value = "false"),
                            @javax.persistence.QueryHint(name = "org.hibernate.flushMode", value = "commit")
             }
   )

        
         ,   @javax.persistence.NamedQuery(
     name="KANDIDATUR.ByNamePraesentationIsNullOrEmpty",
     query="SELECT o FROM Kandidatur o WHERE o.namePraesentation IS NULL OR o.namePraesentation = ''",
     hints = {@javax.persistence.QueryHint(name = "org.hibernate.cacheable", value = "false"),
                            @javax.persistence.QueryHint(name = "org.hibernate.flushMode", value = "commit")
             }
   )

        
         ,   @javax.persistence.NamedQuery(
     name="KANDIDATUR.GeschlechtAndFamiliennameOrGeschlechtAndGeburtsdatum",
     query="SELECT k FROM Kandidatur k WHERE k.geschlecht = ?1 AND (k.familienname = ?2 OR k.geburtsdatum = ?3)",
     hints = {@javax.persistence.QueryHint(name = "org.hibernate.cacheable", value = "false"),
                            @javax.persistence.QueryHint(name = "org.hibernate.flushMode", value = "commit")
             }
   )

        
         ,   @javax.persistence.NamedQuery(
     name="KANDIDATUR.PersonenVerknuepfungKandidaturKandidaturByWahlAndVerknuepfungsStatus",
     query="SELECT o FROM PersonenVerknuepfung o WHERE o.verknuepfungsStatus=?2 AND EXISTS (SELECT k1 FROM Kandidatur k1 WHERE k1.wahl = ?1 AND o.person1=k1) AND EXISTS (SELECT k2 FROM Kandidatur k2 WHERE k2.wahl = ?1 AND o.person2=k2)",
     hints = {@javax.persistence.QueryHint(name = "org.hibernate.cacheable", value = "true"),
                            @javax.persistence.QueryHint(name = "org.hibernate.flushMode", value = "commit")
             }
   )

        
         ,   @javax.persistence.NamedQuery(
     name="KANDIDATUR.PersonenVerknuepfungKandidaturKandidaturByWahl",
     query="SELECT o FROM PersonenVerknuepfung o WHERE EXISTS (SELECT k1 FROM Kandidatur k1 WHERE k1.wahl = ?1 AND o.person1=k1) AND EXISTS (SELECT k2 FROM Kandidatur k2 WHERE k2.wahl = ?1 AND o.person2=k2)",
     hints = {@javax.persistence.QueryHint(name = "org.hibernate.cacheable", value = "true"),
                            @javax.persistence.QueryHint(name = "org.hibernate.flushMode", value = "commit")
             }
   )

        
         ,   @javax.persistence.NamedQuery(
     name="KANDIDATUR.Wahl",
     query="SELECT o FROM Kandidatur o WHERE o.wahl=?1",
     hints = {@javax.persistence.QueryHint(name = "org.hibernate.cacheable", value = "true"),
                            @javax.persistence.QueryHint(name = "org.hibernate.flushMode", value = "commit")
             }
   )

        
     }
)
@javax.enterprise.inject.Vetoed
@javax.persistence.Entity
@javax.persistence.Table(name = "KANDIDATUR")
@javax.persistence.Cacheable
@javax.persistence.PrimaryKeyJoinColumn(name="personendaten_id")
@javax.persistence.DiscriminatorValue(Kandidatur.DISCRIMINATOR_VALUE)

public
 class Kandidatur
extends AbstractKandidatur
  {

  private static final long serialVersionUID = 0L;

  public static final String DISCRIMINATOR_VALUE = "KANDIDATUR";

  /**
   * default constructor (protected, da mit CustomData aufgerufen werden muss)
   */
  protected Kandidatur() {
    super();
  }
    public Kandidatur(de.ivu.elect.jee.entity.customdata.CustomData customData){
        super(customData);
      }



    /**
     * @param original
     *
     * @deprecated Sollte nur mit Bedacht genutzt werden, da hier auch die Beziehungen kopiert werden. Deswegen markiert
     *             als Deprecated.
     */
    @Deprecated
    public Kandidatur(Kandidatur original){
      original.copyEntity(this);
    }


  @Override
  public void resetAttributeChanged() {
        hasChangedBerufPraesentation = false;
          hasChangedGeburtsortPraesentation = false;
          hasChangedKandidaturQuelle = false;
          hasChangedKandidaturStatus = false;
          hasChangedNamePraesentation = false;
          hasChangedWaehlbar = false;
          hasChangedWohnortPraesentation = false;
  


          hasChangedErsatzkandidatursByUebergeordneteKandidatur = false;
                hasChangedGewaehltsByKandidatur = false;
                      
    super.resetAttributeChanged();
  }


  /**
   * ATTRIBUTE
   */

    
  @javax.persistence.Column(name = "BERUF_PRAESENTATION", nullable = KandidaturConstants.BERUF_PRAESENTATION_NULLABLE, length=KandidaturConstants.BERUF_PRAESENTATION_MAX_LENGTH)
        @java.lang.Deprecated
  protected java.lang.String berufPraesentation =  null;

  @javax.persistence.Transient
  protected boolean hasChangedBerufPraesentation = false;

  public boolean hasChangedBerufPraesentation(){
    return hasChangedBerufPraesentation;
  }
       @javax.persistence.Transient
     private transient boolean isSeitLadenVeraendertBerufPraesentation = false;
     @javax.persistence.Transient
     private transient java.lang.String wertNachLadenBerufPraesentation;
  
  /**
   * 
   *
   * getter for KANDIDATUR.BERUF_PRAESENTATION
   */
  @javax.annotation.Nullable   @Override   public  java.lang.String getBerufPraesentation() {
        return berufPraesentation;
      }

  /**
   * 
   *
   * setter for KANDIDATUR.BERUF_PRAESENTATION
   *
   * @param berufPraesentation
   */
  @Override   public void setBerufPraesentation(@javax.annotation.Nullable  java.lang.String berufPraesentation) {

       resetTkCache();
                  
                          java.lang.String berufPraesentationInternal = de.ivu.elect.jee.entity.EntityUtil.trimToNullOrMaxLength(berufPraesentation, KandidaturConstants.BERUF_PRAESENTATION_MAX_LENGTH, getId(), getClass());
                  
       
      boolean thisAttributChanged =
      !de.ivu.elect.jee.entity.EntityUtil.compareObjects(this.berufPraesentation
      , berufPraesentationInternal);

      attributeChanged |= thisAttributChanged;

      hasChangedBerufPraesentation |= thisAttributChanged;

      if (thisAttributChanged) {
      markDirty("berufPraesentation");
      }


             if (!isSeitLadenVeraendertBerufPraesentation) {
          isSeitLadenVeraendertBerufPraesentation = thisAttributChanged;
         if (isSeitLadenVeraendertBerufPraesentation){
           wertNachLadenBerufPraesentation=this.berufPraesentation;
         }
       }
      

       this.berufPraesentation = berufPraesentationInternal;

         }

        
  @javax.persistence.Column(name = "GEBURTSORT_PRAESENTATION", nullable = KandidaturConstants.GEBURTSORT_PRAESENTATION_NULLABLE, length=KandidaturConstants.GEBURTSORT_PRAESENTATION_MAX_LENGTH)
        @java.lang.Deprecated
  protected java.lang.String geburtsortPraesentation =  null;

  @javax.persistence.Transient
  protected boolean hasChangedGeburtsortPraesentation = false;

  public boolean hasChangedGeburtsortPraesentation(){
    return hasChangedGeburtsortPraesentation;
  }
       @javax.persistence.Transient
     private transient boolean isSeitLadenVeraendertGeburtsortPraesentation = false;
     @javax.persistence.Transient
     private transient java.lang.String wertNachLadenGeburtsortPraesentation;
  
  /**
   * 
   *
   * getter for KANDIDATUR.GEBURTSORT_PRAESENTATION
   */
  @javax.annotation.Nullable   @Override   public  java.lang.String getGeburtsortPraesentation() {
        return geburtsortPraesentation;
      }

  /**
   * 
   *
   * setter for KANDIDATUR.GEBURTSORT_PRAESENTATION
   *
   * @param geburtsortPraesentation
   */
  @Override   public void setGeburtsortPraesentation(@javax.annotation.Nullable  java.lang.String geburtsortPraesentation) {

       resetTkCache();
                  
                          java.lang.String geburtsortPraesentationInternal = de.ivu.elect.jee.entity.EntityUtil.trimToNullOrMaxLength(geburtsortPraesentation, KandidaturConstants.GEBURTSORT_PRAESENTATION_MAX_LENGTH, getId(), getClass());
                  
       
      boolean thisAttributChanged =
      !de.ivu.elect.jee.entity.EntityUtil.compareObjects(this.geburtsortPraesentation
      , geburtsortPraesentationInternal);

      attributeChanged |= thisAttributChanged;

      hasChangedGeburtsortPraesentation |= thisAttributChanged;

      if (thisAttributChanged) {
      markDirty("geburtsortPraesentation");
      }


             if (!isSeitLadenVeraendertGeburtsortPraesentation) {
          isSeitLadenVeraendertGeburtsortPraesentation = thisAttributChanged;
         if (isSeitLadenVeraendertGeburtsortPraesentation){
           wertNachLadenGeburtsortPraesentation=this.geburtsortPraesentation;
         }
       }
      

       this.geburtsortPraesentation = geburtsortPraesentationInternal;

         }

        
    @javax.persistence.Enumerated(javax.persistence.EnumType.STRING)
      @javax.persistence.Column(name = "KANDIDATUR_QUELLE", nullable = KandidaturConstants.KANDIDATUR_QUELLE_NULLABLE)
    
  protected de.ivu.elect.business.kandidatur.entity.KandidaturQuelle kandidaturQuelle =  de.ivu.elect.business.kandidatur.entity.KandidaturQuelle.UNBEKANNT;

  @javax.persistence.Transient
  protected boolean hasChangedKandidaturQuelle = false;

  public boolean hasChangedKandidaturQuelle(){
    return hasChangedKandidaturQuelle;
  }
       @javax.persistence.Transient
     private transient boolean isSeitLadenVeraendertKandidaturQuelle = false;
     @javax.persistence.Transient
     private transient de.ivu.elect.business.kandidatur.entity.KandidaturQuelle wertNachLadenKandidaturQuelle;
  
  /**
   * 
   *
   * getter for KANDIDATUR.KANDIDATUR_QUELLE
   */
    @Override   public  de.ivu.elect.business.kandidatur.entity.KandidaturQuelle getKandidaturQuelle() {
        return kandidaturQuelle;
      }

  /**
   * 
   *
   * setter for KANDIDATUR.KANDIDATUR_QUELLE
   *
   * @param kandidaturQuelle
   */
  @Override   public void setKandidaturQuelle( de.ivu.elect.business.kandidatur.entity.KandidaturQuelle kandidaturQuelle) {

       resetTkCache();
                  de.ivu.elect.business.kandidatur.entity.KandidaturQuelle kandidaturQuelleInternal = kandidaturQuelle;
       
       
      boolean thisAttributChanged =
      !de.ivu.elect.jee.entity.EntityUtil.compareObjects(this.kandidaturQuelle
      , kandidaturQuelleInternal);

      attributeChanged |= thisAttributChanged;

      hasChangedKandidaturQuelle |= thisAttributChanged;

      if (thisAttributChanged) {
      markDirty("kandidaturQuelle");
      }


             if (!isSeitLadenVeraendertKandidaturQuelle) {
          isSeitLadenVeraendertKandidaturQuelle = thisAttributChanged;
         if (isSeitLadenVeraendertKandidaturQuelle){
           wertNachLadenKandidaturQuelle=this.kandidaturQuelle;
         }
       }
      

       this.kandidaturQuelle = kandidaturQuelleInternal;

         }

        
    @javax.persistence.Enumerated(javax.persistence.EnumType.STRING)
      @javax.persistence.Column(name = "KANDIDATUR_STATUS", nullable = KandidaturConstants.KANDIDATUR_STATUS_NULLABLE)
    
  protected de.ivu.elect.business.kandidatur.entity.KandidaturStatus kandidaturStatus =  de.ivu.elect.business.kandidatur.entity.KandidaturStatus.OFFEN;

  @javax.persistence.Transient
  protected boolean hasChangedKandidaturStatus = false;

  public boolean hasChangedKandidaturStatus(){
    return hasChangedKandidaturStatus;
  }
       @javax.persistence.Transient
     private transient boolean isSeitLadenVeraendertKandidaturStatus = false;
     @javax.persistence.Transient
     private transient de.ivu.elect.business.kandidatur.entity.KandidaturStatus wertNachLadenKandidaturStatus;
  
  /**
   * 
   *
   * getter for KANDIDATUR.KANDIDATUR_STATUS
   */
    @Override   public  de.ivu.elect.business.kandidatur.entity.KandidaturStatus getKandidaturStatus() {
        return kandidaturStatus;
      }

  /**
   * 
   *
   * setter for KANDIDATUR.KANDIDATUR_STATUS
   *
   * @param kandidaturStatus
   */
  @Override   public void setKandidaturStatus( de.ivu.elect.business.kandidatur.entity.KandidaturStatus kandidaturStatus) {

       resetTkCache();
                  de.ivu.elect.business.kandidatur.entity.KandidaturStatus kandidaturStatusInternal = kandidaturStatus;
       
                de.ivu.elect.business.kandidatur.entity.KandidaturStatus alterWert = getKandidaturStatus();
         kandidaturStatusInternal = preProcessKandidaturStatus(kandidaturStatusInternal);
         preSetKandidaturStatus(alterWert, kandidaturStatusInternal);
       
      boolean thisAttributChanged =
      !de.ivu.elect.jee.entity.EntityUtil.compareObjects(this.kandidaturStatus
      , kandidaturStatusInternal);

      attributeChanged |= thisAttributChanged;

      hasChangedKandidaturStatus |= thisAttributChanged;

      if (thisAttributChanged) {
      markDirty("kandidaturStatus");
      }


             if (!isSeitLadenVeraendertKandidaturStatus) {
          isSeitLadenVeraendertKandidaturStatus = thisAttributChanged;
         if (isSeitLadenVeraendertKandidaturStatus){
           wertNachLadenKandidaturStatus=this.kandidaturStatus;
         }
       }
      

       this.kandidaturStatus = kandidaturStatusInternal;

                postSetKandidaturStatus(alterWert, kandidaturStatusInternal);
         }

  
    @Override
    protected de.ivu.elect.business.kandidatur.entity.KandidaturStatus preProcessKandidaturStatus(de.ivu.elect.business.kandidatur.entity.KandidaturStatus neuerWert) {
      return super.preProcessKandidaturStatus(neuerWert);
    }

    @Override
    protected void preSetKandidaturStatus(de.ivu.elect.business.kandidatur.entity.KandidaturStatus alterWert, de.ivu.elect.business.kandidatur.entity.KandidaturStatus neuerWert) {
      super.preSetKandidaturStatus(alterWert, neuerWert);
    }

    @Override
    protected void postSetKandidaturStatus(de.ivu.elect.business.kandidatur.entity.KandidaturStatus alterWert, de.ivu.elect.business.kandidatur.entity.KandidaturStatus neuerWert) {
      super.postSetKandidaturStatus(alterWert, neuerWert);
    }
        
  @javax.persistence.Column(name = "NAME_PRAESENTATION", nullable = KandidaturConstants.NAME_PRAESENTATION_NULLABLE, length=KandidaturConstants.NAME_PRAESENTATION_MAX_LENGTH)
        @java.lang.Deprecated
  protected java.lang.String namePraesentation =  null;

  @javax.persistence.Transient
  protected boolean hasChangedNamePraesentation = false;

  public boolean hasChangedNamePraesentation(){
    return hasChangedNamePraesentation;
  }
       @javax.persistence.Transient
     private transient boolean isSeitLadenVeraendertNamePraesentation = false;
     @javax.persistence.Transient
     private transient java.lang.String wertNachLadenNamePraesentation;
  
  /**
   * 
   *
   * getter for KANDIDATUR.NAME_PRAESENTATION
   */
  @javax.annotation.Nullable   @Override   public  java.lang.String getNamePraesentation() {
        return namePraesentation;
      }

  /**
   * 
   *
   * setter for KANDIDATUR.NAME_PRAESENTATION
   *
   * @param namePraesentation
   */
  @Override   public void setNamePraesentation(@javax.annotation.Nullable  java.lang.String namePraesentation) {

       resetTkCache();
                  
                          java.lang.String namePraesentationInternal = de.ivu.elect.jee.entity.EntityUtil.trimToNullOrMaxLength(namePraesentation, KandidaturConstants.NAME_PRAESENTATION_MAX_LENGTH, getId(), getClass());
                  
       
      boolean thisAttributChanged =
      !de.ivu.elect.jee.entity.EntityUtil.compareObjects(this.namePraesentation
      , namePraesentationInternal);

      attributeChanged |= thisAttributChanged;

      hasChangedNamePraesentation |= thisAttributChanged;

      if (thisAttributChanged) {
      markDirty("namePraesentation");
      }


             if (!isSeitLadenVeraendertNamePraesentation) {
          isSeitLadenVeraendertNamePraesentation = thisAttributChanged;
         if (isSeitLadenVeraendertNamePraesentation){
           wertNachLadenNamePraesentation=this.namePraesentation;
         }
       }
      

       this.namePraesentation = namePraesentationInternal;

         }

        
    @javax.persistence.Enumerated(javax.persistence.EnumType.STRING)
      @javax.persistence.Column(name = "WAEHLBAR", nullable = KandidaturConstants.WAEHLBAR_NULLABLE)
    
  protected de.ivu.elect.business.kandidatur.entity.Waehlbarkeit waehlbar =  de.ivu.elect.business.kandidatur.entity.Waehlbarkeit.UNBEKANNT;

  @javax.persistence.Transient
  protected boolean hasChangedWaehlbar = false;

  public boolean hasChangedWaehlbar(){
    return hasChangedWaehlbar;
  }
       @javax.persistence.Transient
     private transient boolean isSeitLadenVeraendertWaehlbar = false;
     @javax.persistence.Transient
     private transient de.ivu.elect.business.kandidatur.entity.Waehlbarkeit wertNachLadenWaehlbar;
  
  /**
   * 
   *
   * getter for KANDIDATUR.WAEHLBAR
   */
    @Override   public  de.ivu.elect.business.kandidatur.entity.Waehlbarkeit getWaehlbar() {
        return waehlbar;
      }

  /**
   * 
   *
   * setter for KANDIDATUR.WAEHLBAR
   *
   * @param waehlbar
   */
  @Override   public void setWaehlbar( de.ivu.elect.business.kandidatur.entity.Waehlbarkeit waehlbar) {

       resetTkCache();
                  de.ivu.elect.business.kandidatur.entity.Waehlbarkeit waehlbarInternal = waehlbar;
       
       
      boolean thisAttributChanged =
      !de.ivu.elect.jee.entity.EntityUtil.compareObjects(this.waehlbar
      , waehlbarInternal);

      attributeChanged |= thisAttributChanged;

      hasChangedWaehlbar |= thisAttributChanged;

      if (thisAttributChanged) {
      markDirty("waehlbar");
      }


             if (!isSeitLadenVeraendertWaehlbar) {
          isSeitLadenVeraendertWaehlbar = thisAttributChanged;
         if (isSeitLadenVeraendertWaehlbar){
           wertNachLadenWaehlbar=this.waehlbar;
         }
       }
      

       this.waehlbar = waehlbarInternal;

         }

        
  @javax.persistence.Column(name = "WOHNORT_PRAESENTATION", nullable = KandidaturConstants.WOHNORT_PRAESENTATION_NULLABLE, length=KandidaturConstants.WOHNORT_PRAESENTATION_MAX_LENGTH)
        @java.lang.Deprecated
  protected java.lang.String wohnortPraesentation =  null;

  @javax.persistence.Transient
  protected boolean hasChangedWohnortPraesentation = false;

  public boolean hasChangedWohnortPraesentation(){
    return hasChangedWohnortPraesentation;
  }
       @javax.persistence.Transient
     private transient boolean isSeitLadenVeraendertWohnortPraesentation = false;
     @javax.persistence.Transient
     private transient java.lang.String wertNachLadenWohnortPraesentation;
  
  /**
   * 
   *
   * getter for KANDIDATUR.WOHNORT_PRAESENTATION
   */
  @javax.annotation.Nullable   @Override   public  java.lang.String getWohnortPraesentation() {
        return wohnortPraesentation;
      }

  /**
   * 
   *
   * setter for KANDIDATUR.WOHNORT_PRAESENTATION
   *
   * @param wohnortPraesentation
   */
  @Override   public void setWohnortPraesentation(@javax.annotation.Nullable  java.lang.String wohnortPraesentation) {

       resetTkCache();
                  
                          java.lang.String wohnortPraesentationInternal = de.ivu.elect.jee.entity.EntityUtil.trimToNullOrMaxLength(wohnortPraesentation, KandidaturConstants.WOHNORT_PRAESENTATION_MAX_LENGTH, getId(), getClass());
                  
       
      boolean thisAttributChanged =
      !de.ivu.elect.jee.entity.EntityUtil.compareObjects(this.wohnortPraesentation
      , wohnortPraesentationInternal);

      attributeChanged |= thisAttributChanged;

      hasChangedWohnortPraesentation |= thisAttributChanged;

      if (thisAttributChanged) {
      markDirty("wohnortPraesentation");
      }


             if (!isSeitLadenVeraendertWohnortPraesentation) {
          isSeitLadenVeraendertWohnortPraesentation = thisAttributChanged;
         if (isSeitLadenVeraendertWohnortPraesentation){
           wertNachLadenWohnortPraesentation=this.wohnortPraesentation;
         }
       }
      

       this.wohnortPraesentation = wohnortPraesentationInternal;

         }

    
/**
 * Beziehungen N:1 unidirektional
 */

/**
 * Beziehungen N:1 bidirektional
 */

  /**
   * Beziehungen 1:N unidirektional (nicht unterstuetzt)
   */

  /**
   * Beziehungen 1:N bidirektional
   */

  /**
   * Beziehung 1:N (bidirektional) zu ErsatzkandidatursByUebergeordneteKandidatur
   *
   */
  @javax.persistence.OneToMany(targetEntity=de.ivu.elect.business.kandidatur.entity.Ersatzkandidatur.class, mappedBy="uebergeordneteKandidatur", fetch=javax.persistence.FetchType.LAZY )
// deaktiviert, gibt Probleme beim Löschen  @org.hibernate.annotations.Cache(usage = org.hibernate.annotations.CacheConcurrencyStrategy.TRANSACTIONAL)
  protected java.util.Set<de.ivu.elect.business.kandidatur.entity.Ersatzkandidatur> ersatzkandidatursByUebergeordneteKandidatur;


  /**
   * getter muss read-only verwendet werden, da die Beziehung auf der anderen Seite nicht aktualisiert wird!
   */
  
  @Override
  public java.util.Set<de.ivu.elect.business.kandidatur.entity.Ersatzkandidatur> getErsatzkandidatursByUebergeordneteKandidatur(){
    if (ersatzkandidatursByUebergeordneteKandidatur == null){
      return  java.util.Collections.<de.ivu.elect.business.kandidatur.entity.Ersatzkandidatur>unmodifiableSet(java.util.Collections.<de.ivu.elect.business.kandidatur.entity.Ersatzkandidatur>emptySet());
    }

    return java.util.Collections.<de.ivu.elect.business.kandidatur.entity.Ersatzkandidatur>unmodifiableSet(this.ersatzkandidatursByUebergeordneteKandidatur);
  }

  @javax.persistence.Transient
  private boolean hasChangedErsatzkandidatursByUebergeordneteKandidatur = false;

  public boolean hasChangedErsatzkandidatursByUebergeordneteKandidatur() {
    return hasChangedErsatzkandidatursByUebergeordneteKandidatur;
  }

  /**
   * Hinzufuegen von de.ivu.elect.business.kandidatur.entity.Ersatzkandidatur
   */
  @Override
  public void addErsatzkandidaturByUebergeordneteKandidatur(de.ivu.elect.business.kandidatur.entity.Ersatzkandidatur ersatzkandidaturByUebergeordneteKandidatur){
    try {
      if (!updateRelationship){
        updateRelationship = true;

        if (ersatzkandidaturByUebergeordneteKandidatur != null){
          if (this.ersatzkandidatursByUebergeordneteKandidatur == null) {
            this.ersatzkandidatursByUebergeordneteKandidatur = new java.util.HashSet<>();
          }

          boolean isChanged = this.ersatzkandidatursByUebergeordneteKandidatur.add(ersatzkandidaturByUebergeordneteKandidatur);

          if(!hasChangedErsatzkandidatursByUebergeordneteKandidatur) {
            hasChangedErsatzkandidatursByUebergeordneteKandidatur =  isChanged;
          }

          // andere Seite der Beziehung aktualisieren
          ersatzkandidaturByUebergeordneteKandidatur.setUebergeordneteKandidatur(this);
        }
      }
    } finally {
      updateRelationship = false;
    }
  }

  /**
   * Entfernen von de.ivu.elect.business.kandidatur.entity.Ersatzkandidatur
   */
  @Override
  public void removeErsatzkandidaturByUebergeordneteKandidatur(de.ivu.elect.business.kandidatur.entity.Ersatzkandidatur ersatzkandidaturByUebergeordneteKandidatur){
    try {
      if (!updateRelationship){
        updateRelationship = true;

        if (ersatzkandidaturByUebergeordneteKandidatur != null){
          if (this.ersatzkandidatursByUebergeordneteKandidatur != null) {
            boolean isChanged = this.ersatzkandidatursByUebergeordneteKandidatur.remove(ersatzkandidaturByUebergeordneteKandidatur);

            if(!hasChangedErsatzkandidatursByUebergeordneteKandidatur) {
              hasChangedErsatzkandidatursByUebergeordneteKandidatur =  isChanged;
            }
          }

          // andere Seite der Beziehung aktualisieren
          ersatzkandidaturByUebergeordneteKandidatur.setUebergeordneteKandidatur(null);
        }
      }
    } finally {
      updateRelationship = false;
    }
  }

 /**
  * Entfernen von allen de.ivu.elect.business.kandidatur.entity.Ersatzkandidatur
  */
   @Override
   public void removeAllErsatzkandidaturByUebergeordneteKandidaturs(){
     java.util.Set<de.ivu.elect.business.kandidatur.entity.Ersatzkandidatur> toRemove = new java.util.HashSet<>(getErsatzkandidatursByUebergeordneteKandidatur());

     for (   de.ivu.elect.business.kandidatur.entity.Ersatzkandidatur entity:toRemove){
       removeErsatzkandidaturByUebergeordneteKandidatur(entity);
     }
   }

  /**
   * Beziehung 1:N (bidirektional) zu GewaehltsByKandidatur
   *
   */
  @javax.persistence.OneToMany(targetEntity=de.ivu.elect.business.ergebnis.entity.Gewaehlt.class, mappedBy="kandidatur", fetch=javax.persistence.FetchType.LAZY )
// deaktiviert, gibt Probleme beim Löschen  @org.hibernate.annotations.Cache(usage = org.hibernate.annotations.CacheConcurrencyStrategy.TRANSACTIONAL)
  protected java.util.Set<de.ivu.elect.business.ergebnis.entity.Gewaehlt> gewaehltsByKandidatur;


  /**
   * getter muss read-only verwendet werden, da die Beziehung auf der anderen Seite nicht aktualisiert wird!
   */
  
  @Override
  public java.util.Set<de.ivu.elect.business.ergebnis.entity.Gewaehlt> getGewaehltsByKandidatur(){
    if (gewaehltsByKandidatur == null){
      return  java.util.Collections.<de.ivu.elect.business.ergebnis.entity.Gewaehlt>unmodifiableSet(java.util.Collections.<de.ivu.elect.business.ergebnis.entity.Gewaehlt>emptySet());
    }

    return java.util.Collections.<de.ivu.elect.business.ergebnis.entity.Gewaehlt>unmodifiableSet(this.gewaehltsByKandidatur);
  }

  @javax.persistence.Transient
  private boolean hasChangedGewaehltsByKandidatur = false;

  public boolean hasChangedGewaehltsByKandidatur() {
    return hasChangedGewaehltsByKandidatur;
  }

  /**
   * Hinzufuegen von de.ivu.elect.business.ergebnis.entity.Gewaehlt
   */
  @Override
  public void addGewaehltByKandidatur(de.ivu.elect.business.ergebnis.entity.Gewaehlt gewaehltByKandidatur){
    try {
      if (!updateRelationship){
        updateRelationship = true;

        if (gewaehltByKandidatur != null){
          if (this.gewaehltsByKandidatur == null) {
            this.gewaehltsByKandidatur = new java.util.HashSet<>();
          }

          boolean isChanged = this.gewaehltsByKandidatur.add(gewaehltByKandidatur);

          if(!hasChangedGewaehltsByKandidatur) {
            hasChangedGewaehltsByKandidatur =  isChanged;
          }

          // andere Seite der Beziehung aktualisieren
          gewaehltByKandidatur.setKandidatur(this);
        }
      }
    } finally {
      updateRelationship = false;
    }
  }

  /**
   * Entfernen von de.ivu.elect.business.ergebnis.entity.Gewaehlt
   */
  @Override
  public void removeGewaehltByKandidatur(de.ivu.elect.business.ergebnis.entity.Gewaehlt gewaehltByKandidatur){
    try {
      if (!updateRelationship){
        updateRelationship = true;

        if (gewaehltByKandidatur != null){
          if (this.gewaehltsByKandidatur != null) {
            boolean isChanged = this.gewaehltsByKandidatur.remove(gewaehltByKandidatur);

            if(!hasChangedGewaehltsByKandidatur) {
              hasChangedGewaehltsByKandidatur =  isChanged;
            }
          }

          // andere Seite der Beziehung aktualisieren
          gewaehltByKandidatur.setKandidatur(null);
        }
      }
    } finally {
      updateRelationship = false;
    }
  }

 /**
  * Entfernen von allen de.ivu.elect.business.ergebnis.entity.Gewaehlt
  */
   @Override
   public void removeAllGewaehltByKandidaturs(){
     java.util.Set<de.ivu.elect.business.ergebnis.entity.Gewaehlt> toRemove = new java.util.HashSet<>(getGewaehltsByKandidatur());

     for (   de.ivu.elect.business.ergebnis.entity.Gewaehlt entity:toRemove){
       removeGewaehltByKandidatur(entity);
     }
   }

  /**
   * Beziehungen N:M bidirektional nicht selbstreferenzierend
   */


  /**
   * Beziehungen N:M bidirektional selbstreferenzierend
   */
  

  @Override
  public String toString() {
    StringBuilder sb = new StringBuilder();
    sb.append("Kandidatur:");
    sb.append(getId());
    sb.append(" (TK: ");
    try {
      sb.append(getTk());
    } catch (Exception e) {
      sb.append(e.getMessage());
    }
    sb.append(")");
    return sb.toString();
}



  /**
   * Kopiert alle Attribute (ausser PK und Version) und UNIDIREKTIONALE n:1-Beziehungen in uebergebene Entitaet.
   *
   * @param other
   *
   * @deprecated Sollte nur mit Bedacht genutzt werden, da hier auch die Beziehungen kopiert werden. Deswegen markiert
   *             als Deprecated.
   */
  @Deprecated
  protected void copyEntity(Kandidatur other){
        super.copyEntity(other);
                             other.berufPraesentation = this.berufPraesentation;
                                other.geburtsortPraesentation = this.geburtsortPraesentation;
                                other.kandidaturQuelle = this.kandidaturQuelle;
                                other.kandidaturStatus = this.kandidaturStatus;
                                other.namePraesentation = this.namePraesentation;
                                other.waehlbar = this.waehlbar;
                                other.wohnortPraesentation = this.wohnortPraesentation;
           
    if (this.transientContext != null && !this.transientContext.isEmpty()) {
      other.getTransientContext().putAll(this.transientContext);
    }
  }



    @Override
    public void copyEntityAttributesToOtherEntity(de.ivu.elect.jee.entity.Entity other) {
      if (other==null){
        return;
      }
      if (other.isInstanceOf(Kandidatur.class)){
        copyEntityAttributesUsingSetter((Kandidatur) other.castTo(Kandidatur.class).getEntity());
      } else {
        throw new IllegalArgumentException("Keine Instanz von Kandidatur: " + other);
      }
    }

  /**
  * Kopiert alle Attribute (ausser PK und Version)  in uebergebene Entitaet.
  *
  */
  public void copyEntityAttributesUsingSetter(Kandidatur other){
      super.copyEntityAttributesUsingSetter(other);
               other.setBerufPraesentation(this.berufPraesentation);
                  other.setGeburtsortPraesentation(this.geburtsortPraesentation);
                  other.setKandidaturQuelle(this.kandidaturQuelle);
                  other.setKandidaturStatus(this.kandidaturStatus);
                  other.setNamePraesentation(this.namePraesentation);
                  other.setWaehlbar(this.waehlbar);
                  other.setWohnortPraesentation(this.wohnortPraesentation);
           if (this.transientContext != null && !this.transientContext.isEmpty()) {
      other.getTransientContext().putAll(this.transientContext);
    }
  }

    @Override
    public void copyEntityAttributesUsingSetter(de.ivu.elect.business.person.entity.Personendaten other){
       if (other.isInstanceOf(Kandidatur.class)) {
         copyEntityAttributesUsingSetter(other.castTo(Kandidatur.class).getEntity());
       } else {
         super.copyEntityAttributesUsingSetter(other);
       }
    }

  /**
   * Kopiert alle veränderten Attribute (ausser PK, CustomData, wenn vorhanden und Version) in uebergebene Entitaet.
   *
   */
  public void copyChangedEntityAttributesUsingSetter(Kandidatur other){
       super.copyChangedEntityAttributesUsingSetter(other);
                       if (hasChangedBerufPraesentation) {
        other.setBerufPraesentation(this.berufPraesentation);
      }
                             if (hasChangedGeburtsortPraesentation) {
        other.setGeburtsortPraesentation(this.geburtsortPraesentation);
      }
                             if (hasChangedKandidaturQuelle) {
        other.setKandidaturQuelle(this.kandidaturQuelle);
      }
                             if (hasChangedKandidaturStatus) {
        other.setKandidaturStatus(this.kandidaturStatus);
      }
                             if (hasChangedNamePraesentation) {
        other.setNamePraesentation(this.namePraesentation);
      }
                             if (hasChangedWaehlbar) {
        other.setWaehlbar(this.waehlbar);
      }
                             if (hasChangedWohnortPraesentation) {
        other.setWohnortPraesentation(this.wohnortPraesentation);
      }
             }

    @Override
    public void copyChangedEntityAttributesUsingSetter(de.ivu.elect.business.person.entity.Personendaten other){
      if (other.isInstanceOf(Kandidatur.class)) {
        copyChangedEntityAttributesUsingSetter(other.castTo(Kandidatur.class).getEntity());
      } else {
        super.copyChangedEntityAttributesUsingSetter(other);
      }
    }




    @javax.persistence.Transient
    private transient KandidaturTK tkCache;

    @Override
    protected void resetTkCache() {
    super.resetTkCache();
        tkCache = null;
    }

    public KandidaturTK getKandidaturTK(){
    if (tkCache==null) {
    tkCache = new KandidaturTK(



  );}
  return tkCache;
}
    @Override
    public de.ivu.elect.jee.entity.tk.EntityTK getTk() {
       return getKandidaturTK();
    }

  @Override
  public KandidaturUK getUk(){
    return getKandidaturUK();
  }

  @Override
  public Class< ? > getEntityClass() {
    return Kandidatur.class;
  }

public KandidaturUK getKandidaturUK(){

   return  new KandidaturUK(



  );
}

  @javax.persistence.Transient
  private transient KandidaturProperties properties;

  @Override
  public KandidaturProperties getProperties(){
    if (properties == null) {
      properties = new KandidaturProperties(this);
    }
    return properties;
  }

  /**
   * @deprecated getProperties() verwenden.
   */
  @Deprecated
  public KandidaturProperties getKandidaturProperties(){
    return getProperties();
  }

  @Override
  public String getEntityTechnicalName() {
    return KandidaturConstants.MESSAGE_KEY_ENTITY_EINZAHL;
  }

  @Override
  public boolean isAenderungenProtokollieren(){
        if (super.isAenderungenProtokollieren()){
      return true;
    }
    
    return true;
  }


    @Override
   public void setProtokollierteAttributeMitWerten(java.util.Map<String, de.ivu.elect.jee.protokollierung.AttributWertVorher> werteVorher) {
            super.setProtokollierteAttributeMitWerten(werteVorher);
     
      if (werteVorher.containsKey(KandidaturConstants.MESSAGE_KEY_BERUF_PRAESENTATION_EINZAHL)){
        de.ivu.elect.jee.protokollierung.AttributWertVorher vorher = werteVorher.get(KandidaturConstants.MESSAGE_KEY_BERUF_PRAESENTATION_EINZAHL);

        berufPraesentation =
     vorher.getAttributTyp().getValueAsString(vorher.getWertVorher());
          }

            
      if (werteVorher.containsKey(KandidaturConstants.MESSAGE_KEY_GEBURTSORT_PRAESENTATION_EINZAHL)){
        de.ivu.elect.jee.protokollierung.AttributWertVorher vorher = werteVorher.get(KandidaturConstants.MESSAGE_KEY_GEBURTSORT_PRAESENTATION_EINZAHL);

        geburtsortPraesentation =
     vorher.getAttributTyp().getValueAsString(vorher.getWertVorher());
          }

            
      if (werteVorher.containsKey(KandidaturConstants.MESSAGE_KEY_KANDIDATUR_QUELLE_EINZAHL)){
        de.ivu.elect.jee.protokollierung.AttributWertVorher vorher = werteVorher.get(KandidaturConstants.MESSAGE_KEY_KANDIDATUR_QUELLE_EINZAHL);

        kandidaturQuelle =
     (de.ivu.elect.business.kandidatur.entity.KandidaturQuelle) vorher.getAttributTyp().getValueAsEnum(vorher.getWertVorher());
          }

            
      if (werteVorher.containsKey(KandidaturConstants.MESSAGE_KEY_KANDIDATUR_STATUS_EINZAHL)){
        de.ivu.elect.jee.protokollierung.AttributWertVorher vorher = werteVorher.get(KandidaturConstants.MESSAGE_KEY_KANDIDATUR_STATUS_EINZAHL);

        kandidaturStatus =
     (de.ivu.elect.business.kandidatur.entity.KandidaturStatus) vorher.getAttributTyp().getValueAsEnum(vorher.getWertVorher());
          }

            
      if (werteVorher.containsKey(KandidaturConstants.MESSAGE_KEY_NAME_PRAESENTATION_EINZAHL)){
        de.ivu.elect.jee.protokollierung.AttributWertVorher vorher = werteVorher.get(KandidaturConstants.MESSAGE_KEY_NAME_PRAESENTATION_EINZAHL);

        namePraesentation =
     vorher.getAttributTyp().getValueAsString(vorher.getWertVorher());
          }

            
      if (werteVorher.containsKey(KandidaturConstants.MESSAGE_KEY_WAEHLBAR_EINZAHL)){
        de.ivu.elect.jee.protokollierung.AttributWertVorher vorher = werteVorher.get(KandidaturConstants.MESSAGE_KEY_WAEHLBAR_EINZAHL);

        waehlbar =
     (de.ivu.elect.business.kandidatur.entity.Waehlbarkeit) vorher.getAttributTyp().getValueAsEnum(vorher.getWertVorher());
          }

            
      if (werteVorher.containsKey(KandidaturConstants.MESSAGE_KEY_WOHNORT_PRAESENTATION_EINZAHL)){
        de.ivu.elect.jee.protokollierung.AttributWertVorher vorher = werteVorher.get(KandidaturConstants.MESSAGE_KEY_WOHNORT_PRAESENTATION_EINZAHL);

        wohnortPraesentation =
     vorher.getAttributTyp().getValueAsString(vorher.getWertVorher());
          }

                }

  @Override
  public java.util.Map<String, de.ivu.elect.jee.protokollierung.VorherNachherWert> getProtokollierteAttributeMitWerten() {
    java.util.Map<String,de.ivu.elect.jee.protokollierung.VorherNachherWert> result;
        result = super.getProtokollierteAttributeMitWerten();
                        if (isSeitLadenVeraendertBerufPraesentation) {
      result.put(KandidaturConstants.MESSAGE_KEY_BERUF_PRAESENTATION_EINZAHL, new de.ivu.elect.jee.protokollierung.VorherNachherWert(
         de.ivu.elect.jee.protokollierung.AttributTyp.STRING
                , wertNachLadenBerufPraesentation , berufPraesentation));
    }
                            if (isSeitLadenVeraendertGeburtsortPraesentation) {
      result.put(KandidaturConstants.MESSAGE_KEY_GEBURTSORT_PRAESENTATION_EINZAHL, new de.ivu.elect.jee.protokollierung.VorherNachherWert(
         de.ivu.elect.jee.protokollierung.AttributTyp.STRING
                , wertNachLadenGeburtsortPraesentation , geburtsortPraesentation));
    }
                            if (isSeitLadenVeraendertKandidaturQuelle) {
      result.put(KandidaturConstants.MESSAGE_KEY_KANDIDATUR_QUELLE_EINZAHL, new de.ivu.elect.jee.protokollierung.VorherNachherWert(
         de.ivu.elect.jee.protokollierung.AttributTyp.ENUM
                , wertNachLadenKandidaturQuelle , kandidaturQuelle));
    }
                            if (isSeitLadenVeraendertKandidaturStatus) {
      result.put(KandidaturConstants.MESSAGE_KEY_KANDIDATUR_STATUS_EINZAHL, new de.ivu.elect.jee.protokollierung.VorherNachherWert(
         de.ivu.elect.jee.protokollierung.AttributTyp.ENUM
                , wertNachLadenKandidaturStatus , kandidaturStatus));
    }
                            if (isSeitLadenVeraendertNamePraesentation) {
      result.put(KandidaturConstants.MESSAGE_KEY_NAME_PRAESENTATION_EINZAHL, new de.ivu.elect.jee.protokollierung.VorherNachherWert(
         de.ivu.elect.jee.protokollierung.AttributTyp.STRING
                , wertNachLadenNamePraesentation , namePraesentation));
    }
                            if (isSeitLadenVeraendertWaehlbar) {
      result.put(KandidaturConstants.MESSAGE_KEY_WAEHLBAR_EINZAHL, new de.ivu.elect.jee.protokollierung.VorherNachherWert(
         de.ivu.elect.jee.protokollierung.AttributTyp.ENUM
                , wertNachLadenWaehlbar , waehlbar));
    }
                            if (isSeitLadenVeraendertWohnortPraesentation) {
      result.put(KandidaturConstants.MESSAGE_KEY_WOHNORT_PRAESENTATION_EINZAHL, new de.ivu.elect.jee.protokollierung.VorherNachherWert(
         de.ivu.elect.jee.protokollierung.AttributTyp.STRING
                , wertNachLadenWohnortPraesentation , wohnortPraesentation));
    }
                return result;
  }

  @Override
  public void resetProtokollierteAttribute() {
        super.resetProtokollierteAttribute();
                      isSeitLadenVeraendertBerufPraesentation = false;
      wertNachLadenBerufPraesentation = null;
                          isSeitLadenVeraendertGeburtsortPraesentation = false;
      wertNachLadenGeburtsortPraesentation = null;
                          isSeitLadenVeraendertKandidaturQuelle = false;
      wertNachLadenKandidaturQuelle = null;
                          isSeitLadenVeraendertKandidaturStatus = false;
      wertNachLadenKandidaturStatus = null;
                          isSeitLadenVeraendertNamePraesentation = false;
      wertNachLadenNamePraesentation = null;
                          isSeitLadenVeraendertWaehlbar = false;
      wertNachLadenWaehlbar = null;
                          isSeitLadenVeraendertWohnortPraesentation = false;
      wertNachLadenWohnortPraesentation = null;
                   }

  @Override
  public  java.util.List<de.ivu.elect.jee.entity.EntityFachlichAbhaengigNode> getFachlichAbhaengigeEntitaeten(){
           java.util.List<de.ivu.elect.jee.entity.EntityFachlichAbhaengigNode> result = super.getFachlichAbhaengigeEntitaeten();
            return result;
  }

        
            @Override
            protected String getInitialDiscriminator() {
              return "KANDIDATUR";
            }

            @Override
            public boolean isInstanceOf(Class<?> clazz) {
            return clazz.isInstance(this);
            }


            @Override
            public <E> de.ivu.elect.jee.entity.EntityContainer<E> castTo(Class<E> clazz) {
                return new de.ivu.elect.jee.entity.EntityContainer<>((E)this); // EntityContainer ist notwendig, da sonst von Hibernate die Entität wieder durch ihren Proxy ersetzt wird...
            }

  @Override
  public boolean isPersistent() {
    return getId() != null;
  }



            
                  @Override
                public void resetValidation() {
                  super.resetValidation();
        
    validationResult = null;
        }

        @javax.persistence.Transient
        private transient java.util.Set<de.ivu.elect.jee.entity.EntityConstraintViolation> validationResult;

                          @Override
                    public java.util.Set<de.ivu.elect.jee.entity.EntityConstraintViolation> validateEntity() {
            if (validationResult==null) {
               validationResult  = new java.util.HashSet<>();
                                  validationResult.addAll(super.validateEntity());
                                                                                                           de.ivu.elect.jee.entity.EntityConstraintCheck.checkStringLength(KandidaturConstants.BERUF_PRAESENTATION_MAX_LENGTH ,  berufPraesentation, this, KandidaturConstants.MESSAGE_KEY_BERUF_PRAESENTATION_EINZAHL, validationResult);
                                                                                                   de.ivu.elect.jee.entity.EntityConstraintCheck.checkStringLength(KandidaturConstants.GEBURTSORT_PRAESENTATION_MAX_LENGTH ,  geburtsortPraesentation, this, KandidaturConstants.MESSAGE_KEY_GEBURTSORT_PRAESENTATION_EINZAHL, validationResult);
                                                           de.ivu.elect.jee.entity.EntityConstraintCheck.checkNotNull(kandidaturQuelle, this, KandidaturConstants.MESSAGE_KEY_KANDIDATUR_QUELLE_EINZAHL, validationResult);
                                                                                           de.ivu.elect.jee.entity.EntityConstraintCheck.checkNotNull(kandidaturStatus, this, KandidaturConstants.MESSAGE_KEY_KANDIDATUR_STATUS_EINZAHL, validationResult);
                                                                                                                                   de.ivu.elect.jee.entity.EntityConstraintCheck.checkStringLength(KandidaturConstants.NAME_PRAESENTATION_MAX_LENGTH ,  namePraesentation, this, KandidaturConstants.MESSAGE_KEY_NAME_PRAESENTATION_EINZAHL, validationResult);
                                                           de.ivu.elect.jee.entity.EntityConstraintCheck.checkNotNull(waehlbar, this, KandidaturConstants.MESSAGE_KEY_WAEHLBAR_EINZAHL, validationResult);
                                                                                                                                   de.ivu.elect.jee.entity.EntityConstraintCheck.checkStringLength(KandidaturConstants.WOHNORT_PRAESENTATION_MAX_LENGTH ,  wohnortPraesentation, this, KandidaturConstants.MESSAGE_KEY_WOHNORT_PRAESENTATION_EINZAHL, validationResult);
                                    }
             return validationResult;
        }

            }
