错误:休眠4.3.1中已存在关系约束

时间:2019-06-10 22:01:44

标签: java hibernate jpa hibernate-mapping

运行dll生成休眠状态时出现此错误

show.html.erb

我正在映射一个复杂的结构,特别是具有复合模式的结构,这是类图:

Class diagram

这是我的班级代码

params[:id]
pizza
Failed to execute:   alter table sezioniastratte add constraint FK_5nekcygup70my0ixo073o215d foreign key (padre_id) references sezioni
org.postgresql.util.PSQLException: ERROR: constraint "fk_5nekcygup70my0ixo073o215d" for relation "sezioniastratte" already exists
package it.unibas.webanalytics.modello;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;

/**
 *
 * @author Vincenzo Palazzo
 */
@Entity(name = "sezioniastratte")
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class AbstractSezione implements ISezione {

    private Long id;
    protected String identificativo;
    private AbstractSezione root;
    private AbstractSezione padre;

    public AbstractSezione(String identificativo) {
        this.identificativo = identificativo;
    }

    public AbstractSezione() {
    }

    @Id
    @GeneratedValue(strategy = GenerationType.TABLE)
    public Long getId() {
        return id;
    }

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

    @Column(unique = true, nullable = false, length = 150)
    public String getIdentificativo() {
        return identificativo;
    }

    public void setIdentificativo(String identificativo) {
        this.identificativo = identificativo;
    }

    @OneToOne
    public AbstractSezione getRoot() {
        return root;
    }

    public void setRoot(AbstractSezione root) {
        this.root = root;
    }

    @ManyToOne(cascade = CascadeType.ALL)
    public AbstractSezione getPadre() {
        return padre;
    }

    public void setPadre(AbstractSezione padre) {
        this.padre = padre;
    }


}
package it.unibas.webanalytics.modello;

import it.unibas.webanalytics.modello.visite.IVisitor;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.UUID;
import javax.persistence.Entity;
import javax.persistence.OneToMany;
import javax.persistence.Transient;

/**
 *
 * @author Vincenzo Palazzo
 */
@Entity(name = "pagine")
public class Pagina extends AbstractSezione{

    @Deprecated
    private String uuid;
    private List<Visualizzazione> visualizzazioni = new ArrayList<>();

    public Pagina(String identificativo) {
        super(identificativo);
        uuid = UUID.randomUUID().toString();
    }

    public Pagina() {
    }

    @OneToMany(mappedBy = "pagina", orphanRemoval = true)
    public List<Visualizzazione> getVisualizzazioni() {
        return visualizzazioni;
    }

    public void addVisualizzazione(Visualizzazione visualizzazione){
        visualizzazioni.add(visualizzazione);
    }

    @Override
    public boolean isPage(){
        return true;
    }

    @Override
    public void accept(IVisitor visitor) {
        visitor.visitaPagina(this);
    }

    @Transient
    public String getUuid() {
        return uuid;
    }

    public void setUuid(String uuid) {
        this.uuid = uuid;
    }

    public void setVisualizzazioni(List<Visualizzazione> visualizzazioni) {
        this.visualizzazioni = visualizzazioni;
    }


    public int dimensione(){
        return this.visualizzazioni.size();
    }


    @Override
    public int hashCode() {
        int hash = 5;
        hash = 67 * hash + Objects.hashCode(super.identificativo);
        hash = 67 * hash + Objects.hashCode(this.uuid);
        return hash;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Pagina other = (Pagina) obj;
        if (!Objects.equals(super.identificativo, other.identificativo)) {
            return false;
        }
        if (!Objects.equals(this.uuid, other.uuid)) {
            return false;
        }
        return true;
    }    
}

package it.unibas.webanalytics.modello;

import it.unibas.webanalytics.modello.visite.IVisitor;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.Entity;
import javax.persistence.OneToMany;

/**
 *
 * @author Vincenzo Palazzo
 */
@Entity(name = "sezioni")
public class Sezione extends AbstractSezione {

    private List<AbstractSezione> sezioniList = new ArrayList<>();

    public Sezione() {
    }

    public Sezione(String identificativo) {
        super(identificativo);
    }

    public void addSezione(AbstractSezione sezione) {
        sezioniList.add(sezione);
    }

    @OneToMany(mappedBy = "padre")
    public List<AbstractSezione> getSezioniList() {
        return sezioniList;
    }

    public void setSezioniList(List<AbstractSezione> sezioniList) {
        this.sezioniList = sezioniList;
    }

    @Override
    public boolean isPage() {
        return false;
    }

    @Override
    public void accept(IVisitor visitor) {
        visitor.visitaSezione(this);
    }

}

Solution

对不起,类图错误,但没有其他示例,对于英语不好,但我正在学习,感到抱歉

1 个答案:

答案 0 :(得分:1)

您在层次结构级别上混合了房地产。

列表必须在AbstractSezione中,或者Padre必须在Sezione中。