首页 > 解决方案 > 错误:关系的约束已经存在于休眠 4.3.1

问题描述

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

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);
    }

}


package it.unibas.webanalytics.modello;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToOne;

/**
 *
 * @author Vincenzo Palazzo
 */
@Entity(name = "portali")
public class PortaleWeb {

    @Id
    @GeneratedValue(strategy = GenerationType.TABLE)
    private long id;
    @Column(nullable = false, unique = true, length = 50)
    private String nomeDominio;
    @Column(nullable = false, unique = true, length = 50)
    private String indirizzoIp;
    @Column(length = 20)
    private String indestatario;
    @OneToOne(mappedBy = "root")
    private AbstractSezione sezione;

    public PortaleWeb() {
    }

    public PortaleWeb(String nomeDominio, String indirizzoIp, String indestatario, AbstractSezione sezione) {
        this.nomeDominio = nomeDominio;
        this.indirizzoIp = indirizzoIp;
        this.indestatario = indestatario;
        this.sezione = sezione;
    }

    public String getNomeDominio() {
        return nomeDominio;
    }

    public String getIndirizzoIp() {
        return indirizzoIp;
    }

    public String getIndestatario() {
        return indestatario;
    }

    public ISezione getSezione() {
        return sezione;
    }

    public void setNomeDominio(String nomeDominio) {
        this.nomeDominio = nomeDominio;
    }

    public void setIndirizzoIp(String indirizzoIp) {
        this.indirizzoIp = indirizzoIp;
    }

    public void setIndestatario(String indestatario) {
        this.indestatario = indestatario;
    }

    public void setSezione(AbstractSezione sezione) {
        this.sezione = sezione;
    }

}


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.ManyToOne;

/**
 *
 * @author Vincenzo Palazzo
 */
@Entity(name = "visualizzazioni")
public class Visualizzazione {

    @Id
    @GeneratedValue(strategy = GenerationType.TABLE)
    private long id;
    @Column(nullable = true, length = 50)
    private String nazioneDiProvenienza;
    @Column(length = 250)
    private String urlProvenienza;
    @Column(length = 250)
    private String urlDestinazione;
    @Column(length = 50)
    private String browser;
    private int daQuanto;
    @ManyToOne(cascade = CascadeType.ALL)
    private Pagina pagina;

    public Visualizzazione() {
    }

    public Visualizzazione(String nazioneDiProvenienza, String urlProvenienza, String urlDestinazione, String browser, int daQuanto) {
        this.nazioneDiProvenienza = nazioneDiProvenienza;
        this.urlProvenienza = urlProvenienza;
        this.urlDestinazione = urlDestinazione;
        this.browser = browser;
        this.daQuanto = daQuanto;
    }

    public String getNazioneDiProvenienza() {
        return nazioneDiProvenienza;
    }

    public String getUrlProvenienza() {
        return urlProvenienza;
    }

    public String getUrlDestinazione() {
        return urlDestinazione;
    }

    public String getBrowser() {
        return browser;
    }

    public int getDaQuanto() {
        return daQuanto;
    }

    public long getId() {
        return id;
    }

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

    public Pagina getPagina() {
        return pagina;
    }

    public void setPagina(Pagina pagina) {
        this.pagina = pagina;
    }

    public void setNazioneDiProvenienza(String nazioneDiProvenienza) {
        this.nazioneDiProvenienza = nazioneDiProvenienza;
    }

    public void setUrlProvenienza(String urlProvenienza) {
        this.urlProvenienza = urlProvenienza;
    }

    public void setUrlDestinazione(String urlDestinazione) {
        this.urlDestinazione = urlDestinazione;
    }

    public void setBrowser(String browser) {
        this.browser = browser;
    }

    public void setDaQuanto(int daQuanto) {
        this.daQuanto = daQuanto;
    }

}

This is the DLL generate by hibernate


    create table pagine (
        page boolean not null,
        id int8 not null,
        primary key (id)
    );

    create table portali (
        id int8 not null,
        indestatario varchar(20),
        indirizzoIp varchar(50) not null,
        nomeDominio varchar(50) not null,
        primary key (id)
    );

    create table sezioni (
        page boolean not null,
        id int8 not null,
        primary key (id)
    );

    create table sezioniastratte (
        id int8 not null,
        identificativo varchar(150) not null,
        padre_id int8,
        root_id int8,
        primary key (id)
    );

    create table utente (
        id int8 not null,
        attivo boolean not null,
        lastLogin timestamp,
        nome varchar(255),
        nomeUtente varchar(255),
        password varchar(255),
        ruolo varchar(255),
        primary key (id)
    );

    create table visualizzazioni (
        id int8 not null,
        browser varchar(50),
        daQuanto int4 not null,
        nazioneDiProvenienza varchar(50),
        urlDestinazione varchar(250),
        urlProvenienza varchar(250),
        pagina_id int8,
        primary key (id)
    );

    alter table portali 
        add constraint UK_7h0fmoqq22xrlcvgnrybiafgb unique (indirizzoIp);

    alter table portali 
        add constraint UK_jywg6ldg7jvgfjgaw9u81bfp8 unique (nomeDominio);

    alter table sezioniastratte 
        add constraint UK_b0jnspivif39dgey09negpjjp unique (identificativo);

    alter table utente 
        add constraint UK_7hipuu05v6vcqr7wbl8q7p4t2 unique (nomeUtente);

    alter table pagine 
        add constraint FK_tijtvrfbi6n06ocq6fpffgdy9 
        foreign key (id) 
        references sezioniastratte;

    alter table sezioni 
        add constraint FK_t88ok4wbwbhdtipul9l11xued 
        foreign key (id) 
        references sezioniastratte;

    alter table sezioniastratte 
        add constraint FK_5nekcygup70my0ixo073o215d 
        foreign key (padre_id) 
        references sezioniastratte;

    alter table sezioniastratte 
        add constraint FK_d0cntmtmcp2wvl6hqr8ddgg8w 
        foreign key (root_id) 
        references sezioniastratte;

    alter table sezioniastratte 
        add constraint FK_5nekcygup70my0ixo073o215d 
        foreign key (padre_id) 
        references sezioni;

    alter table visualizzazioni 
        add constraint FK_dblrq69ykw1wch2pn845p4xf7 
        foreign key (pagina_id) 
        references pagine;

    create table hibernate_sequences (
         sequence_name varchar(255),
         sequence_next_hi_value int4 
    );

解决方案

对不起类图错误但没有另一个例子也对不起我糟糕的英语但我正在学习

标签: javahibernatejpahibernate-mapping

解决方案


您与层次结构级别的关系混合在一起。

列表必须在AbstractSezione或 padre 必须在Sezione.


推荐阅读