Usando @Mappedsuperclass e @IdClass juntas

3 respostas
brunohansen

Estou tentando fazer isto porém o hibernate me retorna um erro.

@MappedSuperclass
public abstract class AbstractObjectItemAssociation implements Serializable {

   private static final long serialVersionUID = 1L;
   
   @Id
   @ManyToOne
   @JoinColumn(name = "obj_item_id")
   @JsonSerialize(using = JsonRelationSerializer.class)
   @JsonDeserialize(using = JsonObjectItemRelationResolver.class)
   private ObjectItem objItem;

   public void setObjItem(ObjectItem objItem) {
      this.objItem = objItem;
   }

   public ObjectItem getObjItem() {
      return objItem;
   }

}

@Entity(name = "obj_item_stat")
@Table(schema = Config.SCHEMA_JC3)
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "cat_code", discriminatorType = DiscriminatorType.STRING, length = 6)
@IdClass(AbstractObjectItemStatusId.class)
public abstract class AbstractObjectItemStatus extends AbstractObjectItemAssociation implements Serializable {

   private static final long serialVersionUID = 1L;
   
   @Id
   @NotNull
   @Digits(integer = 20, fraction = 0)
   @Column(name = "obj_item_stat_ix")
   private BigInteger ix;

   @NotNull
   @CatCode
   @Column(name = "cat_code")
   private String objectItemStatusCategoryCode;

        ...

}

public class AbstractObjectItemStatusId implements Serializable
{
    private static final long serialVersionUID = 1L;
   
    private BigInteger objItem;
    private BigInteger ix;

    public AbstractObjectItemStatusId() {
    }

    ...

}

Erro:

org.hibernate.AnnotationException: Property of @IdClass not found in entity br.mil.mar.casnav.jc3iedm.status.AbstractObjectItemStatus: objItem
   at org.hibernate.cfg.AnnotationBinder.fillComponent(AnnotationBinder.java:2407)
   at org.hibernate.cfg.AnnotationBinder.bindIdClass(AnnotationBinder.java:2520)
   at org.hibernate.cfg.AnnotationBinder.mapAsIdClass(AnnotationBinder.java:874)
   at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:692)
...

Alguém sabe o porque deste erro? O códgio me parece correto.

3 Respostas

Hebert_Coelho

Cara até hoje eu só vi @IdClass ser utilizado para chave composta. Chave Primária Composta ou http://www.objectdb.com/java/jpa/entity/id

Onde você já viu exemplo da utilização desses dois caras juntos?

brunohansen

jakefrog:
Cara até hoje eu só vi @IdClass ser utilizado para chave composta. Chave Primária Composta ou http://www.objectdb.com/java/jpa/entity/id

Onde você já viu exemplo da utilização desses dois caras juntos?

Opa!

Este é um caso de utilização do @IdClass para chave composta. Porém, se você reparar parte do id esta na Mappedsuperclass e outra parte esta na Entity.

Nunca vi um exemplo deste tipo, porém me parece bem traquila este tipo de implementação.

Tem alguma ideia de como fazer isto funcionar?

[]s

Hebert_Coelho

Realmente não sei. Até onde tinha visto o ID fica em uma classe apenas, mas nunca com ID “picado”.

Para se utilizar um id composto a classe tem que seguir alguns requisitos, é por isso q eu acho que o IdClass não funcionaria.

Infelizmente não sei como te ajudar sem mudar a estrutura da sua aplicação. Sorry. =/

Criado 20 de junho de 2012
Ultima resposta 20 de jun. de 2012
Respostas 3
Participantes 2