Para entrar en situación voy a exponer un pequeño ejemplo con el que todos los labos y ex-labos estaremos familiarizados:
Supongamos que por una extraña razón a Geno se le juntan muchos marrones encima (cosa que no pasa casi nunca ;)) y por otro lado están (estabamos) todos los precarios, entonces le encarga a Rafa que los reparta de una forma sencilla. Rafa como está apuntito de casarse piensa que lo mejor es hacer una aplicación sencilla para que Geno la pueda utilizar y le deje escribir su tesis, que aunque él cree que la lleva bien aún le queda por escribir unas 100 páginas.La aplicación será llamada Brown Dispatching y su modelo de datos generaría unas 3 tablas:
- Una tabla para cada miembro del labo, donde podríamos incluir el nombre del precario, el nombre de la máquina, las horas que está o cualquier otra información que pudiese resultar útil para esta situación. En el caso del ejemplo, creo que con el nombre bastaría, además que somos pocos y nos conocemos perfectamente.
- Otra tabla para cada marrón, indicando el nombre, una descripción y una fecha límite por poner unos campos de ejemplo.
- La tercera tabla sería la que finalmente enlazaría a los marrones con los precarios. Por lo que tendría unicamente el identificador único de marrón y el identificador único de usuario.
imports ... @Entity @Table(name = "T_PRECARIOS") public class Precario implements IGwtSerializableParameter { private Long id; private String name; private Setbrowns; // ID SETTER AND GETTER @Id @GeneratedValue(strategy=GenerationType.AUTO) @Column(name="ID") public Long getId() { return id; } public void setId(Long id) { this.id = id; } // NAME SETTER AND GETTER @Column(name = "NAME", nullable = false) public String getName() { return name; } public void setName(String name) { this.name = name; } // BROWNS SETTER AND GETTER @ManyToMany( cascade = { CascadeType.MERGE, CascadeType.PERSIST }, fetch = FetchType.EAGER ) @JoinTable( name = "T_PRECARIOS_BROWNS", joinColumns = { @JoinColumn(name = "PRECARIO_ID") }, inverseJoinColumns = { @JoinColumn(name = "BROWN_ID") } ) public Set getBrowns() { return browns; } public void setBrowns(Set browns) { this.browns = browns; } ... }
import ... @Entity @Table(name = "T_BROWNS") public class Brown implements IGwtSerializableParameter { private Long id; // Unique identifier for brown private String name; // Brown's name private String description; // Brown's description private Date finalDate; // Brown's final date private SetEn modo de anotaciones de Hibernate, las notaciones se pueden poner en la definición del atributo o en el Getter del mismo, como se puede ver yo he elegido ponerlas en el getter.precarios; // Set with the "precarios" associated // SETTER AND GETTER FOR ID @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "ID") public Long getId() { return id; } public void setId(Long id) { this.id = id; } // SETTER AND GETTER FOR NAME @Column(name = "NAME", nullable = false) public String getName() { return name; } public void setName(String name) { this.name = name; } // SETTER AND GETTER FOR DESCRIPTION @Column(name = "DESCRIPTION", nullable = false) public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } // SETTER AND GETTER FOR FINAL DATE @Column(name = "FINAL_DATE", nullable = false) @Temporal(TemporalType.DATE) public Date getFinalDate() { return finalDate; } public void setFinalDate(Date finalDate) { this.finalDate = finalDate; } // SETTER AND GETTER FOR "PRECARIOS" @ManyToMany( mappedBy = "browns", cascade = { CascadeType.MERGE, CascadeType.PERSIST }, fetch = FetchType.EAGER ) public Set getPrecarios() { return precarios; } public void setPrecarios(Set precarios) { this.precarios = precarios; } ... }