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:
- apartado
- 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