package org.transgalactica.management.data.people.bo.impl;
import java.time.LocalDate;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.DiscriminatorColumn;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
import lombok.AccessLevel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import org.transgalactica.fwk.domain.bean.BusinessIdentifier;
import org.transgalactica.management.data.materiel.bo.VaisseauEntity;
import org.transgalactica.management.data.materiel.bo.impl.JpaVaisseauEntity;
import org.transgalactica.management.data.people.bo.EmployeEntity;
import org.transgalactica.management.data.people.bo.validation.Past;
import org.transgalactica.management.data.referentiel.bo.EmployeType;
@Data
@EqualsAndHashCode(of = "matricule")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity
@Table(name = "EMPLOYES")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "type_employe")
public abstract class AbstractJpaEmployeEntity implements EmployeEntity {
private static final long serialVersionUID = 1L;
@BusinessIdentifier
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long matricule;
@Column(name = "nom")
private String nom;
// TODO A remplacer lorsque java.time sera compris dans JSR303.
@Past
@Column(name = "date_embauche")
private LocalDate dateEmbauche;
@Enumerated(EnumType.STRING)
@Column(name = "type_employe", nullable = false, insertable = false, updatable = false)
private EmployeType type;
@ManyToMany(targetEntity = JpaVaisseauEntity.class, cascade = CascadeType.ALL)
@JoinTable(name = "AFFECTATION_EMPLOYES_VAISSEAUX", joinColumns = @JoinColumn(name = "id_employe", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "id_vaisseau", referencedColumnName = "id"))
private Set<VaisseauEntity> vaisseaux = new HashSet<>();
/*
* Methodes deleguées
*/
@Override
public boolean addVaisseau(VaisseauEntity vaisseau) {
return vaisseaux.add(vaisseau);
}
@Override
public boolean removeVaisseau(VaisseauEntity vaisseau) {
return vaisseaux.remove(vaisseau);
}
}