首页 > 解决方案 > 在实体中建立自动关系时错误事务中止

问题描述

我有一个公司(Empresa)和专业(Profissional)实体,我需要在公司和公司(总部和分公司)之间建立自我关系。专业人员具有技术职责 (ResponsabilidadeTecnica),除其他属性外,他们负责的公司。但是,当我放置此属性时,在尝试加载由以下原因引起的对象时出现 Transaction Aborted 错误:`Caused by: org.hibernate.PropertyAccessException:IllegalArgumentException 发生调用 br.org.creapi.entities.Pessoa.codigo 的 getter。如果我删除自我关系,则不会发生中止的事务。我无法理解错误的来源或如何解决它。

实体和方法写在 PT-BR

实体:

@Entity
@Table(name = "empresa")
@PrimaryKeyJoinColumn(name = "codigo")
public class Empresa extends Pessoa implements Serializable {
    private Empresa matriz;
    // OTHER ATTRIBUTES

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "matriz_codigo", insertable = true, updatable = true, nullable = true)
    public Empresa getMatriz() {
        return matriz;
    }

    public void setMatriz(Empresa matriz) {
        this.matriz = matriz;
    }

    // OTHER METHODS
}

@Entity
public class ResponsabilidadeTecnica implements Serializable {

    private ResponsabilidadeTecnicaPk pk;
    
    @EmbeddedId
    public ResponsabilidadeTecnicaPk getPk() {
        return pk;
    }

    public void setPk(ResponsabilidadeTecnicaPk pk) {
        this.pk = pk;
    }

    // OTHER ATTRIBUTES AND METHODS
}

@Embeddable
public class ResponsabilidadeTecnicaPk implements Serializable {

    private Empresa empresa;
    private Profissional profissional;
    private Date inicioResponsabilidade;
    private String inicioResponsabilidadeFormatado;

    public ResponsabilidadeTecnicaPk() {
        this.empresa = new Empresa();
        this.profissional = new Profissional();
    }

    @ManyToOne
    public Empresa getEmpresa() {
       return empresa;
    }

     public void setEmpresa(Empresa empresa) {
          this.empresa = empresa;
     }
}

发生错误的方法:

@Override
public Profissional profissionalCompletoArtOnLine(String codigo) {
    Profissional profissional = pesquisarPorId(codigo);
    Hibernate.initialize(profissional.getEnderecosPessoas());
    Hibernate.initialize(profissional.getTitulos());
    Hibernate.initialize(profissional.getPosgraduacoes());
    Hibernate.initialize(profissional.getResponsabilidadesTecnicas()); // THE ERROR OCCURS HERE
    Collections.sort(profissional.getResponsabilidadesTecnicas(), comparator);

    return profissional;
}

当 hibernate 加载专业人员拥有的技术职责列表时,会发生事务中止错误。

标签: javahibernate

解决方案


推荐阅读