febrero 18, 2016 martosfre
Muchas veces se necesite crear una clave primaria utilizando más de una
columna ya sea que ésta este formado por dos columnas simples o que una
de ellas represente un
FK de otra tabla. Para representar esto en JPA utilizaremos el siguiente ejemplo relacional.
En este caso la tabla
Mat_Tarea tiene dos PK y una de ellas es FK de la tabla
Mat_Proyecto; para realizar el respectivo mapeo en JPA se debe realizar lo siguiente:
- Crear los EntityBean para cada tabla
Proyecto
[code]
package com.matoosfe.modelo.entitybeans;
import java.io.Serializable;
import javax.persistence.*;
import java.util.Date;
import java.util.Set;
/**
* The persistent class for the Mat_Proyecto database table.
*
*/
@Entity
@Table(name="Mat_Proyecto")
public class Proyecto implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int idProy;
private String desProy;
@Temporal( TemporalType.TIMESTAMP)
private Date fecFinProy;
@Temporal( TemporalType.TIMESTAMP)
private Date fecIniProy;
private String nomProy;
//bi-directional many-to-one association to Tarea
@OneToMany(mappedBy="matProyecto")
private Set<Tarea> matTareas;
public Proyecto() {
}
public int getIdProy() {
return this.idProy;
}
public void setIdProy(int idProy) {
this.idProy = idProy;
}
public String getDesProy() {
return this.desProy;
}
public void setDesProy(String desProy) {
this.desProy = desProy;
}
public Date getFecFinProy() {
return this.fecFinProy;
}
public void setFecFinProy(Date fecFinProy) {
this.fecFinProy = fecFinProy;
}
public Date getFecIniProy() {
return this.fecIniProy;
}
public void setFecIniProy(Date fecIniProy) {
this.fecIniProy = fecIniProy;
}
public String getNomProy() {
return this.nomProy;
}
public void setNomProy(String nomProy) {
this.nomProy = nomProy;
}
public Set<Tarea> getMatTareas() {
return this.matTareas;
}
public void setMatTareas(Set<Tarea> matTareas) {
this.matTareas = matTareas;
}
}
[/code]
Tarea
[code]
package com.matoosfe.modelo.entitybeans;
import java.io.Serializable;
import javax.persistence.*;
import java.util.Date;
import java.util.Set;
/**
* The persistent class for the Mat_Tarea database table.
*
*/
@Entity
@Table(name="Mat_Tarea")
public class Tarea implements Serializable {
private static final long serialVersionUID = 1L;
@EmbeddedId
private TareaPK id;
@Temporal( TemporalType.TIMESTAMP)
private Date fechaFinTar;
@Temporal( TemporalType.TIMESTAMP)
private Date fechaIniTar;
private String nomTarea;
//bi-directional many-to-one association to Proyecto
@ManyToOne
@JoinColumn(name="idProy", insertable=false, updatable=false)
private Proyecto matProyecto;
public Tarea() {
}
public TareaPK getId() {
return this.id;
}
public void setId(TareaPK id) {
this.id = id;
}
public Date getFechaFinTar() {
return this.fechaFinTar;
}
public void setFechaFinTar(Date fechaFinTar) {
this.fechaFinTar = fechaFinTar;
}
public Date getFechaIniTar() {
return this.fechaIniTar;
}
public void setFechaIniTar(Date fechaIniTar) {
this.fechaIniTar = fechaIniTar;
}
public String getNomTarea() {
return this.nomTarea;
}
public void setNomTarea(String nomTarea) {
this.nomTarea = nomTarea;
}
public Proyecto getMatProyecto() {
return this.matProyecto;
}
public void setMatProyecto(Proyecto matProyecto) {
this.matProyecto = matProyecto;
}
}
[/code]
- Cuando se tiene más de una columna como PK se debe crear una clase por tabla donde se asocia todos los atributos que representan la PK y relacionarlo con la clase padre. En este caso se creará una clase llamada TareaPK como se muestra a continuación.
[code]
package com.matoosfe.modelo.entitybeans;
import java.io.Serializable;
import javax.persistence.*;
/**
* The primary key class for the Mat_Tarea database table.
*
*/
@Embeddable
public class TareaPK implements Serializable {
//default serial version id, required for serializable classes.
private static final long serialVersionUID = 1L;
private int idTarea;
private int idProy;
public TareaPK() {
}
public int getIdTarea() {
return this.idTarea;
}
public void setIdTarea(int idTarea) {
this.idTarea = idTarea;
}
public int getIdProy() {
return this.idProy;
}
public void setIdProy(int idProy) {
this.idProy = idProy;
}
public boolean equals(Object other) {
if (this == other) {
return true;
}
if (!(other instanceof TareaPK)) {
return false;
}
TareaPK castOther = (TareaPK)other;
return
(this.idTarea == castOther.idTarea)
&& (this.idProy == castOther.idProy);
}
public int hashCode() {
final int prime = 31;
int hash = 17;
hash = hash * prime + this.idTarea;
hash = hash * prime + this.idProy;
return hash;
}
}
[/code]
- Como último paso se tiene que aumentar los atributos insertable=false y updatable=false en el mapeo de la relación existente en el POJO Tarea con Proyecto para realizar la dependencia.
[code]
package com.matoosfe.modelo.entitybeans;
import java.io.Serializable;
import javax.persistence.*;
import java.util.Date;
import java.util.Set;
/**
* The persistent class for the Mat_Tarea database table.
*
*/
@Entity
@Table(name="Mat_Tarea")
public class Tarea implements Serializable {
private static final long serialVersionUID = 1L;
@EmbeddedId
private TareaPK id;
@Temporal( TemporalType.TIMESTAMP)
private Date fechaFinTar;
@Temporal( TemporalType.TIMESTAMP)
private Date fechaIniTar;
private String nomTarea;
//bi-directional many-to-one association to Proyecto
@ManyToOne
@JoinColumn(name="idProy", insertable=false, updatable=false)
private Proyecto matProyecto;
.......
}
[/code]
Saludos