У меня проблема с отображением Hibernate Inheritance, пример
У меня есть портал с дополнительным разделом, и этот раздел может быть страницей или другим разделом, страница может иметь больше визуализаций.
Мое веб-приложение рассчитывает на портале все страницы с большей визуализацией, приложение работает с фиктивным объектом, но не работает с hibernate, портал и корневой каталог раздела работают нормально, но все дочерние элементы нет.
Я изучаю Hibernate и впервые пробую @Inheritance(strategy = InheritanceType.JOINED)
Я допустил ошибку при отображении спящего режима с помощью InheritanceType.JOINED?
Это диаграмма классов с UML и всем кодом для отображения
код класса
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package it.unibas.webanalytics.modello;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.DiscriminatorColumn;
import javax.persistence.Entity;
import javax.persistence.FetchType;
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.OneToMany;
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 PortaleWeb root;
private List<AbstractSezione> sezioniList = new ArrayList<>();
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(length = 150)
public String getIdentificativo() {
return identificativo;
}
public void setIdentificativo(String identificativo) {
this.identificativo = identificativo;
}
@OneToOne(mappedBy = "sezione", cascade = {CascadeType.ALL}, fetch = FetchType.EAGER)
public PortaleWeb getRoot() {
return root;
}
public void setRoot(PortaleWeb root) {
this.root = root;
}
public void addSezione(AbstractSezione sezione) {
sezioniList.add(sezione);
}
@OneToMany(mappedBy = "padre", orphanRemoval = true, cascade = {CascadeType.ALL}, fetch = FetchType.EAGER)
public List<AbstractSezione> getSezioniList() {
return sezioniList;
}
public void setSezioniList(List<AbstractSezione> sezioniList) {
this.sezioniList = sezioniList;
}
public void setPadre(AbstractSezione padre) {
this.padre = padre;
}
@ManyToOne(cascade = {CascadeType.ALL}, fetch = FetchType.EAGER)
public AbstractSezione getPadre() {
return padre;
}
}
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
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.CascadeType;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import javax.persistence.FetchType;
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, cascade = {CascadeType.ALL}, fetch = FetchType.EAGER)
public List<Visualizzazione> getVisualizzazioni() {
return visualizzazioni;
}
public void addVisualizzazione(Visualizzazione visualizzazione){
visualizzazioni.add(visualizzazione);
}
@Override
@Transient
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;
}
}
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package it.unibas.webanalytics.modello;
import it.unibas.webanalytics.modello.visite.IVisitor;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import javax.persistence.PrimaryKeyJoinColumn;
import javax.persistence.Transient;
/**
*
* @author Vincenzo Palazzo
*/
@Entity(name = "sezioni")
public class Sezione extends AbstractSezione {
public Sezione() {
}
public Sezione(String identificativo) {
super(identificativo);
}
@Override
@Transient
public boolean isPage() {
return false;
}
@Override
public void accept(IVisitor visitor) {
//Non riesco ad applicare la correzione che ha detto il prof. (fix)
/*for(ISezione sezione : sezioni){
sezione.accept(visitor);
}*/
visitor.visitaSezione(this);
}
}
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
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 {
private long id;
private String nazioneDiProvenienza;
private String urlProvenienza;
private String urlDestinazione;
private String browser;
private int daQuanto;
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;
}
@Column(length = 50)
public String getNazioneDiProvenienza() {
return nazioneDiProvenienza;
}
@Column(length = 250)
public String getUrlProvenienza() {
return urlProvenienza;
}
@Column(length = 250)
public String getUrlDestinazione() {
return urlDestinazione;
}
@Column(length = 50)
public String getBrowser() {
return browser;
}
public int getDaQuanto() {
return daQuanto;
}
@Id
@GeneratedValue(strategy = GenerationType.TABLE)
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
@ManyToOne(cascade = {CascadeType.ALL})
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;
}
}
Мой общий DAO для выполнения всех операций с Hibernate
package it.unibas.webanalytics.persistenza.hibernate;
import it.unibas.webanalytics.eccezioni.DAOException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
public class DAOUtilHibernate {
private static Log logger = LogFactory.getLog(DAOUtilHibernate.class);
private static SessionFactory sessionFactory;
private static ServiceRegistry serviceRegistry;
static {
try {
Configuration conf = new Configuration().configure();
ServiceRegistry sr = new StandardServiceRegistryBuilder().applySettings(conf.getProperties()).build();
sessionFactory = conf.buildSessionFactory(sr);
} catch (Throwable ex) {
logger.error("Building SessionFactory failed.", ex);
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
public static Session getCurrentSession() throws DAOException {
try {
return sessionFactory.getCurrentSession();
} catch (HibernateException ex) {
logger.error(ex);
throw new DAOException(ex);
}
}
public static void beginTransaction() throws DAOException {
try {
sessionFactory.getCurrentSession().beginTransaction();
} catch (HibernateException ex) {
logger.error(ex);
throw new DAOException(ex);
}
}
public static void commit() throws DAOException {
try {
sessionFactory.getCurrentSession().getTransaction().commit();
} catch (HibernateException ex) {
logger.error(ex);
throw new DAOException(ex);
}
}
public static void rollback() {
try {
sessionFactory.getCurrentSession().getTransaction().rollback();
} catch (HibernateException ex) {
logger.error(ex);
}
}
}
пример варианта использования
У меня есть веб-портал, который содержит композицию разделов, раздел - это страница или другой раздел со списком страниц, мой сценарий использования представлен тем, что я выбираю портал (я могу загрузить порталы) и на следующем На странице я захожу на составной слой и получаю все визуализации, которые вижу в таблице, когда я делаю этот сценарий использования, загружаются не представления.
Я загружаю все веб-порталы с помощью findAll (), который применяет их критерии, и оттуда у вас будет вся структура, загруженная БД, то есть я ожидаю, что портал, разделы, страницы и представления это неправильно?