使用InheritanceType.JOINED形式的Hibernate父亲不会使用Hibernate 4.3.1加载子级

时间:2019-06-11 17:06:54

标签: java hibernate join hibernate-mapping

我在映射休眠继承方面有问题,例如

我有一个包含更多部分的门户,该部分可以是页面,也可以是另一部分,页面可以具有更多可视化效果。

我的Web应用程序从门户网站计算出的所有页面都具有更高的可视化效果,该应用程序可与模拟对象一起使用,但不能与休眠对象一起使用,门户网站和部分根加载正常,但所有子项都没有。

我正在学习Hibernate,并且是第一次尝试@Inheritance(strategy = InheritanceType.JOINED)

我使用InheritanceType.JOINED映射了休眠状态时发生了错误?

这是带有UML和所有映射代码的类图

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加载的所有结构,也就是说我希望门户,部分,页面和视图是错误的吗?

0 个答案:

没有答案