我在映射休眠继承方面有问题,例如
我有一个包含更多部分的门户,该部分可以是页面,也可以是另一部分,页面可以具有更多可视化效果。
我的Web应用程序从门户网站计算出的所有页面都具有更高的可视化效果,该应用程序可与模拟对象一起使用,但不能与休眠对象一起使用,门户网站和部分根加载正常,但所有子项都没有。
我正在学习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,用于使用休眠模式执行所有操作
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);
}
}
}
用例示例
我有一个包含部分组成的Web门户,一个部分是一个页面或另一个包含页面列表的部分,我的用例由以下方式表示:我选择一个门户(我可以加载门户),随后页面,我访问了复合层,并获得了在表格中看到的所有可视化效果,当我使用此用例时,未加载视图。 我用适用于它们的条件的findAll()加载了所有的Web门户,然后从那里您将拥有db加载的所有结构,也就是说我希望门户,部分,页面和视图是错误的吗?