View Javadoc
1   package net.sumaris.core.model.referential.taxon;
2   
3   /*-
4    * #%L
5    * SUMARiS:: Core
6    * %%
7    * Copyright (C) 2018 SUMARiS Consortium
8    * %%
9    * This program is free software: you can redistribute it and/or modify
10   * it under the terms of the GNU General Public License as
11   * published by the Free Software Foundation, either version 3 of the
12   * License, or (at your option) any later version.
13   * 
14   * This program is distributed in the hope that it will be useful,
15   * but WITHOUT ANY WARRANTY; without even the implied warranty of
16   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17   * GNU General Public License for more details.
18   * 
19   * You should have received a copy of the GNU General Public
20   * License along with this program.  If not, see
21   * <http://www.gnu.org/licenses/gpl-3.0.html>.
22   * #L%
23   */
24  
25  import lombok.Data;
26  import lombok.experimental.FieldNameConstants;
27  import net.sumaris.core.model.administration.programStrategy.TaxonGroupStrategy;
28  import net.sumaris.core.model.referential.IItemReferentialEntity;
29  import net.sumaris.core.model.referential.Status;
30  import net.sumaris.core.model.referential.metier.Metier;
31  import org.hibernate.annotations.Cascade;
32  
33  import javax.persistence.*;
34  import java.util.Date;
35  import java.util.List;
36  
37  /**
38   *  Il désigne un ensemble de taxons appartenant à des groupes taxinomiques différents mais ayant les mêmes caractéristiques pour un critère donné. Ce critère peut être morpho-anatomique (par exemple les strates algales ou la taille des organismes), comportemental (par exemple des groupes trophiques ou des modes de déplacement), ou encore basé sur des notions plus complexes comme la polluo-sensibilité (exemple des groupes écologiques définis pour les macroinvertébrés benthiques). Pour un critère donné, les groupes de taxons sont rassemblés dans un regroupement appelé groupe de taxons père.
39   *
40   * Les groupes de taxons sont de deux catégories : <ul>
41   *   <li>Descriptif : c'est à dire seulement utilisé pour l'extraction de données. Les regroupements de taxons sont effectués en aval de la mesure effectuée.</li>
42   *   <li>Identification : il s'agit de regroupements utilisés pour identifier des catégories de taxons sur le terrain ou en laboratoire, lorsqu'il est difficile d'opérer une identification précise ou lorsque celle-ci s'avère tout simplement impossible ou non pertinente. Le regroupement des taxons s'effectue alors en amont de la mesure.</li>
43   * </ul>
44   *
45   * Certains groupes peuvent être figés, c'est à dire qu'ils sont définis une bonne fois pour toute dans un document. Pour ce dernier cas particulier, il n'y a donc, a priori, pas besoin de mise à jour, et encore moins de pouvoir les supprimer : ils sont donc non modifiables (mais ce ne doit pas être une règle générale)
46   *
47   */
48  @Data
49  @FieldNameConstants
50  @Entity
51  @Table(name = "taxon_group")
52  public class TaxonGroup implements IItemReferentialEntity {
53  
54      @Id
55      @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "TAXON_GROUP_SEQ")
56      @SequenceGenerator(name = "TAXON_GROUP_SEQ", sequenceName="TAXON_GROUP_SEQ")
57      private Integer id;
58  
59      @ManyToOne(fetch = FetchType.LAZY)
60      @JoinColumn(name = "status_fk", nullable = false)
61      private Status status;
62  
63      @Column(name = "creation_date", nullable = false)
64      @Temporal(TemporalType.TIMESTAMP)
65      private Date creationDate;
66  
67      @Column(name = "update_date")
68      @Temporal(TemporalType.TIMESTAMP)
69      private Date updateDate;
70  
71      @Column(length = LENGTH_LABEL)
72      private String label;
73  
74      @Column(nullable = false, length = LENGTH_NAME)
75      private String name;
76  
77      private String description;
78  
79      @Column(length = LENGTH_COMMENTS)
80      private String comments;
81  
82      @ManyToOne(fetch = FetchType.LAZY, targetEntity = TaxonGroupType.class)
83      @JoinColumn(name = "taxon_group_type_fk", nullable = false)
84      private TaxonGroupType taxonGroupType;
85  
86      @ManyToOne(fetch = FetchType.LAZY, targetEntity = TaxonGroup.class)
87      @JoinColumn(name = "parent_taxon_group_fk")
88      private TaxonGroup parentTaxonGroup;
89  
90      @OneToMany(fetch = FetchType.LAZY, targetEntity = TaxonGroupStrategy.class, mappedBy = TaxonGroupStrategy.Fields.TAXON_GROUP)
91      @Cascade(org.hibernate.annotations.CascadeType.DETACH)
92      private List<TaxonGroupStrategy> strategies;
93  
94      @OneToMany(fetch = FetchType.LAZY, targetEntity = Metier.class, mappedBy = Metier.Fields.TAXON_GROUP)
95      @Cascade(org.hibernate.annotations.CascadeType.DETACH)
96      private List<Metier> metiers;
97  }