martes, 4 de enero de 2011

Recursividad y Embebida

Lo primero que vamos a tratar es una clase RECURSIVA:

Una clase recursiva se compone de un padre y una lista de hijos. Para ello será necesario aplicar el PATRON COMPOSITE:


Para componer esta clase será necesario definir una propiedad padre (APARTADO) y una propiedad hijos (SUBAPARTADOS). Cuando se mapee dicha clase se deberá tener también en cuenta que nos encontraremos dos TABLAS:

  1. apartado
  2. apartado_subapartados

Como se modela dicha clase:

@Entity(name="SAGA_PLANEMPRESA_APARTADO")
@Inheritance (strategy=InheritanceType.SINGLE_TABLE)
public class ApartadoEntity implements Serializable{


@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="id")
private Long id;

@OneToMany(cascade = CascadeType.ALL,fetch = FetchType.LAZY)
@JoinTable(name = "SAGA_PLANEMPRESA_SUBAPARTADOS",
joinColumns = @JoinColumn(name = "apartado_id"),
inverseJoinColumns = @JoinColumn(name="subApartado_id") )
private List<ApartadoEntity> hijos=new ArrayList<ApartadoEntity>();

@ManyToOne( cascade = {CascadeType.PERSIST, CascadeType.MERGE} )
@JoinTable(name="SAGA_PLANEMPRESA_SUBAPARTADOS",
joinColumns = @JoinColumn(name="subApartado_id"),
inverseJoinColumns = @JoinColumn(name="apartado_id")
)
private ApartadoEntity padre;


public ApartadoEntity() {
super();
}


public ApartadoEntity(ApartadoEntity padre) {
super();
this.padre = padre;
}

public Long getId() {
return id;
}

public void setId(Long id){
this.id=id;
}


public List<ApartadoEntity> getHijos() {
return hijos;
}

public void setHijos(List<ApartadoEntity> hijos) {
this.hijos = hijos;
}

public ApartadoEntity getPadre() {
return padre;
}

public void setPadre(ApartadoEntity padre) {
this.padre = padre;
}


}


Clase EMBEBIDA:

Es posible declarar un componente integrado dentro de la entidad e incluso anular su asignación de columna. Clases de componentes tienen que ser anotado en el nivel de clase con la anotación @Embeddable. Es posible anular la asignación de columna de un objeto incrustado en una entidad en particular mediante el @Embedded y @AttributeOverride anotación en la propiedad asociada:


Intentaremos implementar las siguientes clases, donde Enlace será la clase embebida:




@Embeddable
public class EnlaceAOpenCmsEntity implements Serializable{


private String path;
private String resourceId;
private String structureId;


public EnlaceAOpenCmsEntity() {

}

public EnlaceAOpenCmsEntity(String path, String resourceId,
String structureId) {
super();
this.path = path;
this.resourceId = resourceId;
this.structureId = structureId;
}

public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
public String getResourceId() {
return resourceId;
}
public void setResourceId(String resourceId) {
this.resourceId = resourceId;
}
public String getStructureId() {
return structureId;
}
public void setStructureId(String structureId) {
this.structureId = structureId;
}

}


@Entity(name="SAGA_PLANEMPRESA_APARTADO")
@Inheritance (strategy=InheritanceType.SINGLE_TABLE)
public class ApartadoEntity implements Serializable{

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="id")
private Long id;

@OneToMany (cascade={CascadeType.ALL})
@JoinColumn(name="apartado_id")
private List<DocumentacionAdjuntaEntity> documentacionAdjunta=new ArrayList<DocumentacionAdjuntaEntity>();

public List<DocumentacionAdjuntaEntity> getDocumentacionAdjunta() {
return documentacionAdjunta;
}

public void setDocumentacionAdjunta(
List<DocumentacionAdjuntaEntity> documentacionAdjunta) {
this.documentacionAdjunta = documentacionAdjunta;
}

private EnlaceAOpenCmsEntity apartadoOpenCms;

@Embedded
@AttributeOverrides({
@AttributeOverride(name="path", column=@Column(name="apartadoOpenCmsPath")),
@AttributeOverride(name="resourceId", column=@Column(name="apartadoOpenCmsResourceId")),
@AttributeOverride(name="structureId", column=@Column(name="apartadoOpenCmsStructureId")),
})
public EnlaceAOpenCmsEntity getApartadoOpenCms() {
return apartadoOpenCms;
}

public void setApartadoOpenCms(EnlaceAOpenCmsEntity apartadoOpenCms) {
this.apartadoOpenCms = apartadoOpenCms;
}

public ApartadoEntity() {
super();
}


public ApartadoEntity(EnlaceAOpenCmsEntity apartadoOpenCms,
List<DocumentacionAdjuntaEntity> documentacionAdjunta) {
super();
this.apartadoOpenCms = apartadoOpenCms;
this.documentacionAdjunta = documentacionAdjunta;
}

public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}


}



@Entity(name="SAGA_PLANEMPRESA_DOCUMENTACIONADJUNTA")
@Inheritance (strategy=InheritanceType.SINGLE_TABLE)
public class DocumentacionAdjuntaEntity {

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="id")
private Long id;


public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}

private EnlaceAOpenCmsEntity apartadoOpenCms;
@Embedded
@AttributeOverrides({
@AttributeOverride(name="path", column=@Column(name="apartadoOpenCmsPath")),
@AttributeOverride(name="resourceId", column=@Column(name="apartadoOpenCmsResourceId")),
@AttributeOverride(name="structureId", column=@Column(name="apartadoOpenCmsStructureId")),
})

public EnlaceAOpenCmsEntity getApartadoOpenCms() {
return apartadoOpenCms;
}

public void setApartadoOpenCms(EnlaceAOpenCmsEntity apartadoOpenCms) {
this.apartadoOpenCms = apartadoOpenCms;
}

@ManyToOne(cascade={CascadeType.ALL})
@JoinColumn(name="apartado_id")
private ApartadoEntity apartado;

public ApartadoEntity getApartado() {
return apartado;
}

public void setApartado(ApartadoEntity apartado) {
this.apartado = apartado;
}

}

No hay comentarios:

Publicar un comentario