Herança ou Composição?

Caros Javaneses,

Qual das modelagens é a correta?

Estou tendo dificuldades em entender padrões de Projetos :shock:
Não sei se penso na perfomance do sistema ou na ótima modelagem do sistema.




Tentarei ser mais específico, existe a modelagem de um sistema OO com banco OO(exemplo:Caché) e a outra com banco Relacional(PostgreSQL) que é o meu caso.
Ai veio a dúvida usar ou não usar Herança ?

package com.frutacor.producao;

/**

  • @author DAVI FERREIRA DE LIMA
  • @author CRISTIANO SALES

*/

import java.io.Serializable;
import java.util.Date;

import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.DiscriminatorColumn;
import javax.persistence.DiscriminatorType;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

import com.frutacor.enums.EnuTipoUnidadePeso;
import com.frutacor.seguranca.BtpUsuario;

/**
*
*

  • ENTIDADE QUE REPRESENTA O CONJUNTO DE FRUTAS DA EMPRESA

*/
@Entity
@Inheritance
@Table(name = ““FRU_FRUTA””)
@DiscriminatorColumn(name = ““FRU_NOME_FRUTA””, discriminatorType = DiscriminatorType.STRING)
@SequenceGenerator(name = ““seqFruta””, sequenceName = ““seqFruta””, allocationSize = 1)
public abstract class Fruta implements Cloneable,Serializable{

/**
 * 
 */
private static final long serialVersionUID = -4460758749463077394L;


/**
 * É UTILIZADO ID DEVIDO AO MAPEAMENTO DO BANCO DE DADOS RELACIONAL
 */
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "\"seqFruta\"")
@Column(name = "\"FRU_SEQ_FRUTA\"", nullable = false)
protected Long fruSeqFruta;

/**
 * NOME DA FRUTA
 */
@Column(name = "\"FRU_NOME_FRUTA\"", nullable = false, length = 60)
protected String fruNomeFruta;

/**
 * TIPO DA UNIDADE DE PESO
 */
@Basic(optional = false)
@Enumerated(EnumType.ORDINAL)
@Column(name = "\"FRU_UNIDADE_PESO_FRUTA\"", nullable = false, length = 2, columnDefinition = "NUMBER", precision = 0)
protected EnuTipoUnidadePeso fruTipoUnidadePesoFruta;	


public Fruta(Long fruSeqFruta, String fruNomeFruta,
		EnuTipoUnidadePeso fruTipoUnidadePesoFruta,
		Date fruDatCadastroFruta,
		BtpClassificacaoCientifica btpClassificacaoCientifica,
		BtpUsuario btpUsuario) {
	super();
	this.fruSeqFruta = fruSeqFruta;
	this.fruNomeFruta = fruNomeFruta;
	this.fruTipoUnidadePesoFruta = fruTipoUnidadePesoFruta;		
}

public Long getFruSeqFruta() {
	return fruSeqFruta;
}

public void setFruSeqFruta(Long fruSeqFruta) {
	this.fruSeqFruta = fruSeqFruta;
}

public String getFruNomeFruta() {
	return fruNomeFruta;
}

public void setFruNomeFruta(String fruNomeFruta) {
	this.fruNomeFruta = fruNomeFruta;
}

public EnuTipoUnidadePeso getUnidadePesoProducao() {
	
	return fruTipoUnidadePesoFruta;
}


public void setUnidadePesoProducao(EnuTipoUnidadePeso enuTipoUnidadePeso) {
	
	this.fruTipoUnidadePesoFruta = enuTipoUnidadePeso;
}

}

package com.frutacor.producao;

import java.io.Serializable;
import java.util.Date;

import javax.persistence.Column;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import com.frutacor.enums.EnuTipoUnidadePeso;
import com.frutacor.seguranca.BtpUsuario;

@Entity
@Table(name = ““BAN_BANANA””)
@DiscriminatorValue(“BANANA”)
@SequenceGenerator(name = “seqBanana”, sequenceName = “seqBanana”, allocationSize = 1)
public class Banana extends Fruta implements Serializable,IBanana{

private static final long serialVersionUID = 3195685501727132993L;

@Enumerated(EnumType.ORDINAL)
@Column(name = "\"BAN_UNIDADE_PROUCAO_BANANA\"", nullable = false, length = 2, columnDefinition = "NUMBER", precision = 0)
protected EnuTipoUnidadePeso banUnidadeProducaoBanana;

@Column(name = "\"BAN_DAT_CADASTRO_BANANA\"", columnDefinition = "DATE")
@Temporal(TemporalType.DATE)
protected Date banDataCadastroBanana;

@Column(name = "\"BAN_PESO_MEDIO_BANANA\"", precision = 10, scale = 2)
protected Double banPesoMedioBanana;

@Column(name = "\"BAN_CICLO_BANANA\"", nullable = false, length = 2, columnDefinition = "NUMBER", precision = 0)
protected Long banCicloBanana;

@Column(name = "\"BAN_CICLO_PROUCAO_BANANA\"", nullable = false, length = 2, columnDefinition = "NUMBER", precision = 0)
protected Long banCicloProducaoBanana;	


public Banana(Long fruSeqFruta, String fruNomeFruta,
		EnuTipoUnidadePeso fruTipoUnidadePesoFruta,
		Date fruDatCadastroFruta,
		BtpClassificacaoCientifica btpClassificacaoCientifica,
		BtpUsuario btpUsuario,
		EnuTipoUnidadePeso banUnidadeProducaoBanana,
		Date banDataCadastroBanana, Double banPesoMedioBanana,
		Long banCicloBanana, Long banCicloProducaoBanana) {
	super(fruSeqFruta, fruNomeFruta, fruTipoUnidadePesoFruta,
			fruDatCadastroFruta, btpClassificacaoCientifica, btpUsuario);		
	this.banUnidadeProducaoBanana = banUnidadeProducaoBanana;
	this.banDataCadastroBanana = banDataCadastroBanana;
	this.banPesoMedioBanana = banPesoMedioBanana;
	this.banCicloBanana = banCicloBanana;
	this.banCicloProducaoBanana = banCicloProducaoBanana;
}


public Date getDataCadastro() {
	
	return banDataCadastroBanana;
}


public void setDataCadastro(Date dataCadastro) {
	this.banDataCadastroBanana = dataCadastro;
	
}	

@Override
public Long getCiclo() {
	
	return banCicloBanana;
}

@Override
public void setCiclo(Long ciclo) {
	this.banCicloBanana = ciclo;
	
}

@Override
public Long getCicloProducao() {
	
	return banCicloProducaoBanana;
}

@Override
public void setCicloProducao(Long cicloProducao) {
	this.banCicloProducaoBanana = cicloProducao;
	
}


@Override
public Double getPesoMedio() {		
	return banPesoMedioBanana;
}


@Override
public void setPesoMedio(Double pesoMedio) {
	this.banPesoMedioBanana = pesoMedio;
	
}

}

Pelo que você postou,não consegui captar nenhuma forma de estruturar as suas classes a não ser por herança.
Por falar em estruturação,você inverteu a seta que indica que a classe Banana herda de fruta( e para as demais).
Mas se houvesse alguma forma de você estruturar esse modelo colocando composição, seria o mais indicado.
Vamos esperar para ver se alguém posta alguma sugestão que encaixe no seu modelo
Abraços.