重复 属性 映射导致 JPA 多对多 - Wildfly9 上的一对多自连接

Duplicate property mapping caused JPA Many To Many - One To Many Self Join on Wildfly9

在我的程序中有以下实体:

@Entity
@Table(name="ta_seg_perfiles")
@NamedQuery(name="Perfil.findAll", query="SELECT p FROM Perfil p")
public class Perfil implements Serializable {
    private static final long serialVersionUID = 1L;
    
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(unique=true, nullable=false)
    private int id;
    
    @Column(nullable=false)
    private String perfil;
    
    @Column(nullable=false)
    private String descripcion;
    
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name="fecha_alta")
    private Date fechaAlta;
    
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name="fecha_modificado")
    private Date fechaModificado;
    
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name="fecha_baja")
    private Date fechaBaja;
    
    @Column(nullable=false, length=15)
    private String auditor;
    
    @OneToMany
    @JoinTable(
            name="ta_seg_perfiles_perfiles",
            joinColumns={@JoinColumn(name="perfil", referencedColumnName ="perfil")},
            inverseJoinColumns={@JoinColumn(name="perfil_asig", referencedColumnName="perfil")}
            )
    private Collection<Perfil> perfilesAsignados;   
    
    
    @ManyToMany(fetch=FetchType.LAZY)
    @JoinTable(
            name="ta_seg_perfiles_funciones",
            joinColumns=@JoinColumn(name="perfil", referencedColumnName="perfil"),
            inverseJoinColumns=@JoinColumn(name="funcion", referencedColumnName="funcion", nullable=false, insertable=false, updatable=false)
            )
    private Collection<Funcion> funciones;
    
    @OneToMany(mappedBy="perfil")
    private Collection<PermisosFuncion> permisosFunciones;
    
    @OneToMany(mappedBy="perfil")
    private Collection<PermisosPagina> permisosPaginas;
    
    
    public Perfil() {
    }


    public int getId() {
        return id;
    }


    public void setId(int id) {
        this.id = id;
    }


    public String getPerfil() {
        return perfil;
    }


    public void setPerfil(String perfil) {
        this.perfil = perfil;
    }


    public String getDescripcion() {
        return descripcion;
    }


    public void setDescripcion(String descripcion) {
        this.descripcion = descripcion;
    }


    public Date getFechaAlta() {
        return fechaAlta;
    }


    public void setFechaAlta(Date fechaAlta) {
        this.fechaAlta = fechaAlta;
    }


    public Date getFechaModificado() {
        return fechaModificado;
    }


    public void setFechaModificado(Date fechaModificado) {
        this.fechaModificado = fechaModificado;
    }


    public Date getFechaBaja() {
        return fechaBaja;
    }


    public void setFechaBaja(Date fechaBaja) {
        this.fechaBaja = fechaBaja;
    }


    public String getAuditor() {
        return auditor;
    }


    public void setAuditor(String auditor) {
        this.auditor = auditor;
    }
    

    public Collection<Perfil> getPerfilesAsignados() {
        return perfilesAsignados;
    }


    public void setPerfilesAsignados(Collection<Perfil> perfilesAsignados) {
        this.perfilesAsignados = perfilesAsignados;
    }


    public Collection<Funcion> getFunciones() {
        return funciones;
    }


    public void setFunciones(Collection<Funcion> funciones) {
        this.funciones = funciones;
    }


    public Collection<PermisosFuncion> getPermisosFunciones() {
        return permisosFunciones;
    }


    public void setPermisosFunciones(Collection<PermisosFuncion> permisosFunciones) {
        this.permisosFunciones = permisosFunciones;
    }


    public Collection<PermisosPagina> getPermisosPaginas() {
        return permisosPaginas;
    }


    public void setPermisosPaginas(Collection<PermisosPagina> permisosPaginas) {
        this.permisosPaginas = permisosPaginas;
    }


    /**
     * @param arg0
     * @return
     * @see java.util.Collection#add(java.lang.Object)
     */
    public Funcion addFuncion(Funcion funcion) {
        this.getFunciones().add(funcion);
        return funcion;
    }


    /**
     * @param arg0
     * @return
     * @see java.util.Collection#remove(java.lang.Object)
     */
    public Funcion removeFuncion(Funcion funcion) {
        this.getFunciones().remove(funcion);
        return funcion;
    }

    public Perfil addPerfilAsignado(Perfil perfil){
        this.getPerfilesAsignados().add(perfil);
        return perfil;
    }
    
    public Perfil removePerfilAsignado(Perfil perfil){
        this.getPerfilesAsignados().add(perfil);
        return perfil;
    }
    
    public PermisosFuncion addPermisosFuncion(PermisosFuncion permisos){
        this.getPermisosFunciones().add(permisos);
        return permisos;
    }
    
    public PermisosFuncion removePermisosFuncion(PermisosFuncion permisos){
        this.getPermisosFunciones().remove(permisos);
        permisos.setPerfil(this);
        return permisos;
    }
    
    public PermisosPagina addPermisosPagina(PermisosPagina permisos){
        this.getPermisosPaginas().add(permisos);
        permisos.setPerfil(null);
        return permisos;
    }

据我所知没有错误。但是,当我将应用程序部署到本地 Wildfly9 服务器时,它会抛出以下异常:

15:14:48,270 ERROR [org.jboss.msc.service.fail] (ServerService Thread Pool -- 288) MSC000001: Failed to start service jboss.persistenceunit."Acumar.ear#Acumar-JPA": org.jboss.msc.service.StartException in service jboss.persistenceunit."Acumar.ear#Acumar-JPA": javax.persistence.PersistenceException: [PersistenceUnit: Acumar-JPA] Unable to build Hibernate SessionFactory
    at org.jboss.as.jpa.service.PersistenceUnitServiceImpl.run(PersistenceUnitServiceImpl.java:172)
    at org.jboss.as.jpa.service.PersistenceUnitServiceImpl.run(PersistenceUnitServiceImpl.java:117)
    at org.wildfly.security.manager.WildFlySecurityManager.doChecked(WildFlySecurityManager.java:665)
    at org.jboss.as.jpa.service.PersistenceUnitServiceImpl.run(PersistenceUnitServiceImpl.java:182)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
    at org.jboss.threads.JBossThread.run(JBossThread.java:320)
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: Acumar-JPA] Unable to build Hibernate SessionFactory
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.persistenceException(EntityManagerFactoryBuilderImpl.java:1249)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.access0(EntityManagerFactoryBuilderImpl.java:120)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.perform(EntityManagerFactoryBuilderImpl.java:860)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.perform(EntityManagerFactoryBuilderImpl.java:850)
    at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.withTccl(ClassLoaderServiceImpl.java:425)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:849)
    at org.jboss.as.jpa.hibernate4.TwoPhaseBootstrapImpl.build(TwoPhaseBootstrapImpl.java:44)
    at org.jboss.as.jpa.service.PersistenceUnitServiceImpl.run(PersistenceUnitServiceImpl.java:154)
    ... 7 more
Caused by: org.hibernate.MappingException: Duplicate property mapping of _ar_asimov_acumar_entidades_seguridad_Perfil_perfilesAsignados found in ar.asimov.acumar.entidades.seguridad.Perfil
    at org.hibernate.mapping.PersistentClass.checkPropertyDuplication(PersistentClass.java:515)
    at org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:505)
    at org.hibernate.mapping.RootClass.validate(RootClass.java:270)
    at org.hibernate.cfg.Configuration.validate(Configuration.java:1360)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1851)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.perform(EntityManagerFactoryBuilderImpl.java:857)
    ... 12 more

任何人都可以告诉我我做错了什么或者我该如何解决这个问题?

我想这行你有两次:

joinColumns=@JoinColumn(name="perfil", referencedColumnName="perfil"),

在第二种情况下,它不应该更像:

joinColumns=@JoinColumn(name="funcion", referencedColumnName="funcion"),

?