Mapeamento de Herança

Olá Pessoal,

Hoje tenho a seguinte hierarquia de classes:

                     Classe
                    /      \
               Classe1  Classe2
                              \
                             Classe3

Classe (abstrata)
Classe1 e Classe2 extendem de Classe (não abstratas)
Classe3 extende de Classe2 (não abstrata)

Para mapear essas classes usei a estratégia JOINED em “Classe”:

@Inheritance(strategy = InheritanceType.JOINED)

Até agora estava funcionando bem para as regras do sistema. Mas surgiu uma nova necessidade, em que o objeto pode ser alterado de Classe2 para Classe3 ou vice-versa.
Não sei se há a possibilidade de tratar isso no mapeamento. Na hora de gravar o objeto que está mudando de classe, o banco reclama. Como não sou muito experiente com JPA, me surgiu esse problema.
Uma possível solução seria a de ter três tabelas:

  • Uma para Classe
  • Uma para Classe2 e Classe3 que contenham todos os atributos de Classe2 e Classe3 (semelhante a estratégia SINGLE_TABLE, mas só para juntar Classe2 e Classe3)
  • Uma para Classe1

Mas eu não consegui fazer isso. É possível? Ou será q existe algum outro artifício mantendo a estratégia JOINED e fazendo algum tratamento na hora de gravar o objeto?

Agradeço a ajuda de vocês…

Valeu!

Olá pessoal,

Ninguém tem alguma idéia para me ajudar? :frowning:

Agradeço a quem puder dar alguma luz…

Valeu…

tive o mesmo problema há um tempo, não achei solução, pelo que percebi , a busca sempre é feita da classe mãe para classe filha, então se sua classe 2 já existe e voce vai salva-la como classe 3, vai ser feito um update no lugar de um isert na classe3.

a solução que encontrei foi retirar herança, e fiz um mapeamento classe3 (0…*)----------------------(1)classe2.

Classe abstrata implementa a interface que define os metodos get e set Id;


@MappedSuperclass
public abstract class SciAbstractEntity implements xyzEntityId,
		Serializable {	
	
	private Long id;
	
@Override
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	public Long getId() {
		return id;
	}

herda da classe acima e sobrecreve o id

@Entity
@Table(name="sci_item_modulo")
@MappedSuperclass
@Inheritance(strategy = InheritanceType.JOINED)
@AttributeOverride(name = "id", column = @Column(name = "item_modulo_id"))
public  class ItemModulo  extends SciAbstractEntity implements Serializable {

herda da classe acima e sobrecreve o id

@SuppressWarnings("serial")
@Entity
@Table(name = "sci_unidade_operacional")
@Inheritance(strategy = InheritanceType.JOINED)
@AttributeOverride(name = "id", column = @Column(name = "uniop_id"))
public class UnidadeOperacional extends ItemModulo implements Serializable{