引用复合键时获取注释异常

时间:2015-02-03 19:19:55

标签: java hibernate hibernate-mapping hibernate-annotations

我在实体中得到了org.hibernate.AnnotationException,看起来对我来说是正确的。

详细错误是:

org.hibernate.AnnotationException: referencedColumnNames(COD_GRUPO_ATRACAO, COD_APLICACAO, COD_GRUPO_ATRACAO) of **.***.*****.***.******.******.AssociacaoGrupoAtracao.associacaoGrupoAtracao referencing **.***.*****.***.******.******.GrupoAtracaoAplicacao not mapped to a single property

这是我的两个实体:

@SuppressWarnings("serial")
public abstract class BaseDomain implements Serializable {
    public final static String DOMAINS_PACKAGE = "**.***.*****.***.domain";
}

@SuppressWarnings("serial")
@Entity
@IdClass(GrupoAtracaoAplicacaoPK.class)
@Table(name = "GRUPO_ATRACAO_APLICACAO")
public class GrupoAtracaoAplicacao extends BaseDomain {

   @Id
   @Column(name = "COD_APLICACAO")
   private Long codAplicacao;

   @Id
   @Column(name = "COD_GRUPO_ATRACAO")
   private Long codGrupoAtracao;

   [...]

   @OneToMany(targetEntity = AssociacaoGrupoAtracao.class)
   @JoinColumns( {
               @JoinColumn(name = "COD_GRUPO_ATRACAO_INFERIOR", referencedColumnName = "COD_GRUPO_ATRACAO", insertable = false, updatable = false),
               @JoinColumn(name = "COD_APLICACAO", referencedColumnName = "COD_APLICACAO", insertable = false, updatable = false),
               @JoinColumn(name = "COD_GRUPO_ATRACAO_SUPERIOR", referencedColumnName = "COD_GRUPO_ATRACAO", insertable = false, updatable = false) 
            })
    private List<AssociacaoGrupoAtracao> associacaoGrupoAtracao;

    [...]
}

public class GrupoAtracaoAplicacaoPK implements Serializable {

    @Column(name = "COD_APLICACAO")
    private Long codAplicacao;

    @Column(name = "COD_GRUPO_ATRACAO")
    private Long codGrupoAtracao;

    [...]
}

@NamedQuery(name = "metadado", query = "FROM AssociacaoGrupoAtracao AGA, GrupoAtracao AS GA, GrupoAtracaoAplicacao AS GAA  WHERE GAA.codGrupoAtracao = AGA.codGrupoAtracaoInferior AND GAA.codAplicacao = AGA.codAplicacao AND GA.codGrupoAtracao = GAA.codGrupoAtracao AND AGA.codAplicacao = ? AND GAA.codMetadadoGrupoAtracao = ? AND AGA.codGrupoAtracaoSuperior = 2 ORDER BY AGA.numOrdem, GA.nomGrupoAtracao ASC")
@Entity
@IdClass(AssociacaoGrupoAtracaoPK.class)
@Table(name = "ASSOCIACAO_GRUPO_ATRACAO")
public class AssociacaoGrupoAtracao extends BaseDomain {

   [...]

   @Id
   @Column(name = "COD_APLICACAO")
   public Long getCodAplicacao() {
       return this.codAplicacao;
   }

   public void setCodAplicacao(Long codAplicacao) {
       this.codAplicacao = codAplicacao;
   }

   @Id
   @Column(name = "COD_GRUPO_ATRACAO_INFERIOR")
   public Long getCodGrupoAtracaoInferior() {
      return this.codGrupoAtracaoInferior;
   }

   public void setCodGrupoAtracaoInferior(Long codGrupoAtracaoInferior) {
      this.codGrupoAtracaoInferior = codGrupoAtracaoInferior;
   }

   @Id
   @Column(name = "COD_GRUPO_ATRACAO_SUPERIOR")
   public Long getCodGrupoAtracaoSuperior() {
      return this.codGrupoAtracaoSuperior;
   }

   public void setCodGrupoAtracaoSuperior(Long codGrupoAtracaoSuperior) {
      this.codGrupoAtracaoSuperior = codGrupoAtracaoSuperior;
   }

   [...]
}

public class AssociacaoGrupoAtracaoPK implements Serializable {

[...]

   @Column(name = "COD_APLICACAO")
   public Long getCodAplicacao() {
      return codAplicacao;
   }

   public void setCodAplicacao(Long codAplicacao) {
      this.codAplicacao = codAplicacao;
   }

   @Column(name = "COD_GRUPO_ATRACAO_INFERIOR")
   public Long getCodGrupoAtracaoInferior() {
      return codGrupoAtracaoInferior;
   }

   public void setCodGrupoAtracaoInferior(Long codGrupoAtracaoInferior) {
      this.codGrupoAtracaoInferior = codGrupoAtracaoInferior;
   }

   @Column(name = "COD_GRUPO_ATRACAO_SUPERIOR")
   public Long getCodGrupoAtracaoSuperior() {
      return codGrupoAtracaoSuperior;
   }

   public void setCodGrupoAtracaoSuperior(Long codGrupoAtracaoSuperior) {
      this.codGrupoAtracaoSuperior = codGrupoAtracaoSuperior;
   }

   [...]
}

任何人都可以指出我做错了什么。 当我使用Hibernate 4和Spring 4将项目部署到JBoss EAP 6时,我遇到了这个错误。

1 个答案:

答案 0 :(得分:0)

我认为问题的出现是因为你在实体中指示@IdClass(GrupoAtracaoAplicacaoPK.class),另外,有两个属性为@Id。在两个实体中,您声明了COD_APLICACAO和COD_GRUPO_ATRACAO列,并且hibernate会混淆。

尝试取出@Id并在GrupoAtracaoAplicacao实体中添加@Column(name =“COD_APLICACAO”,insertable = false,updatable = false)。

相关问题