I have this error when running the dll generated the hibernate
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
I'm mapping a complex structure, in particular, a structure with the composite pattern, this is the class diagram:
This is my code of the classes
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
);
Sorry for the class diagram wrong but not have another example also sorry for my terrible English but I'm learning
You mixed with the realtionships on the hierarchy levels.
Either the list must be in the AbstractSezione
or the padre must be in the Sezione
.