如何使用hibernate访问oneToMany数据? (休眠+春+ Primefaces)

时间:2015-01-13 14:00:03

标签: hibernate primefaces

我是hibernate的新手,我试图访问数据但没有成功:(。我试了一个月。我有两个表,第一个Empresa和第二个LDiario。我可以看到Empresa数据,但当我选择一个无线电按钮进入下一个表(LDiario)时,我看到它无效。

OneToMany Empresa - > LDIario ManyToOne LDIario - > Empresa

我正在使用Primefaces。对不起我的英语,我正在学习它。

更新我已经完成了LDiario,Empresa的更新,并添加了EmpresaBean

EmpresaDaoImpl

@Transactional
@Named
public class EmpresaDaoImpl implements EmpresaDao{

    @Inject
    private SessionFactory sessionFactory;

    @Override
    public List<Empresa> findAll() {
        return sessionFactory.getCurrentSession().createQuery("from Empresa").list();
    } 
}

LDiarioImpl

@Transactional
@Named
public class LDiarioDaoImpl implements LDiarioDao{

    @Inject
    private SessionFactory sessionFactory;

    @Override
    public List<LDiario> findAll() {
        return sessionFactory.getCurrentSession().createQuery("from LDiario").list();
    }
}

Empresa 更新

@Entity
@Table(name = "empresas")
public class Empresa implements Serializable{

@Id 
@Column(name = "CLAVE")
@GeneratedValue private Integer CLAVE;

@OneToMany(mappedBy = "empresa")
private List<LDiario> ldiarios; 

LDiario

@Entity
@Table(name = "LDIARIO2014")
public class LDiario implements Serializable{

@Id 
@Column(name = "CLAVE")
@GeneratedValue private Integer CLAVE;  

@ManyToOne  
@JoinColumn (name = "empresa_id") 
private Empresa empresa;

Empresa View(Primeface)可行。

 <p:dataTable id="radioDT"  var="emp" value="#{empresaBean.getEmpresaList()}"  
                selection="#{empresaBean.selectedEmpresa}" rowKey="#{emp.CLAVE}">



    <f:facet name="header">
            Lista de Empresas
         </f:facet>
         <p:column selectionMode="single" style="width:16px;text-align:center"/>         
      <p:column headerText="Id">
       <h:outputText value="#{emp.CLAVE}" />
       </p:column>

         <p:column headerText="Nombre Empresa">
       <h:outputText value="#{emp.NOMBRE}" />
       </p:column>

         <p:column headerText="AÑO">
       <h:outputText value="#{emp.EJERCICIO}" />
       </p:column>

       <!-- "#{empresaBean.selectedEmpresa}" -->
<f:facet name="footer"

&GT; LDiario View(Not Works)

<p:dataTable   var="ld" value="#{empresaBean.ldiario}" rowKey="#{ld.CLAVE}">
        <!-- selection="#{ldiarioBean.selectedLdiario}" rowKey="#{ld.CLAVE}" -->

        <f:facet name="header">
            Listado Diario
         </f:facet>
         <p:column selectionMode="single" style="width:16px;text-align:center"/>         
      <p:column headerText="ASIENTO">
       <h:outputText value="#{ld.ASIENTO}" />
       </p:column>

         <p:column headerText="FECHA">
       <h:outputText value="#{ld.FECHA}" />
       </p:column>

         <p:column headerText="SUBCUENTA">
       <h:outputText value="#{ld.SUBCUENTA}" />
       </p:column>

           <p:column headerText="CONCEPTO">
       <h:outputText value="#{ld.CONCEPTO}" />
       </p:column>

我不知道问题是EmpresaDaoService还是其他问题。我不知道写这部分。

LDiario视图

<p:dataTable   var="ld" value="#{empresaBean.ldiario}" rowKey="#{ld.CLAVE}">
非常感谢。

EmpresaBean

@ManagedBean(name="empresaBean")
@ViewScoped
@Named
public class EmpresaBean {

    @Inject
    private EmpresaService empresaService;
    private Empresa empresa;
    private Empresa selectedEmpresa;
    private LDiario ldiario;




    public LDiario getLdiario() {
        return ldiario;
    }

    public void setLdiario(LDiario ldiario) {
        this.ldiario = ldiario;
    }

    public EmpresaService getEmpresaService() {
        return empresaService;
    }

    public Empresa getSelectedEmpresa() {
        return selectedEmpresa;
    }

    public void setSelectedEmpresa(Empresa selectedEmpresa) {
        this.selectedEmpresa = selectedEmpresa;
    }

    public void setEmpresaService(EmpresaService empresaService) {
        this.empresaService = empresaService;
    }

    public EmpresaBean(){
    }

    public List<Empresa> getEmpresaList(){

        return empresaService.getAll();
    }

    public Empresa getEmpresa() {
        return empresa;
    }
    public void setEmpresa(Empresa empresa) {
        this.empresa = empresa;
    }  

    public String View() {

        return "/pages/menu/menuPrincipal?faces-redirect=true";
    }

}

我正在使用dbvisualizer,因为数据库是其他软件,我不理解每个表。  enter image description here

PKTABLE_NAME EMPRESAS LDIARIO2014
PKCOLUMN_NAME CLAVE CLAVE
FK_NAME INTEG_651
PK_NAME INTEG_39

更新2 我添加了两张新图片。我认为错误就像你在empresa_id中所说,但我知道我必须写在那里。

enter image description here enter image description here

LDiarioBean

@ManagedBean(name="ldiarioBean")
@ViewScoped
@Named
public class LDiarioBean {


    private LDiario ldiario;
    @Inject
    private LDiarioService ldiarioservice;

    private LDiario selectedLdiario;

    public LDiarioService getLdiarioservice() {
        return ldiarioservice;
    }
    public void setLDiarioservice(LDiarioService ldiarioservice) {
        this.ldiarioservice = ldiarioservice;
    }


    public LDiarioBean(){

    }
    public LDiario getLdiario() {
        return ldiario;
    }
    public void setLdiario(LDiario ldiario) {
        this.ldiario = ldiario;
    } 
    public LDiario getSelectedLdiario() {
        return selectedLdiario;
    }
    public void setSelectedLdiario(LDiario selectedLdiario) {
        this.selectedLdiario = selectedLdiario;
    }    

public List<LDiario> getLDiarioList(){

        return ldiarioservice.getAll();
    }

    public LDiario getLDiario() {
        return ldiario;
    }
    public void setLDiario(LDiario ldiario) {
        this.ldiario = ldiario;
    } 
}

LDiarioDAOImpl

@Transactional
@Named
public class LDiarioDaoImpl implements LDiarioDao{

    @Inject
    private SessionFactory sessionFactory;

    @Override
    public List<LDiario> findAll() {
        return sessionFactory.getCurrentSession().createQuery("from LDiario").list();
    }
}

2 个答案:

答案 0 :(得分:0)

试试这个

@OneToMany(fetch = FetchType.EAGER)
@JoinColumn(name = "empresa")
private List<LDiario> ldiarios;

答案 1 :(得分:0)

您的映射是错误的,请使用此

// Empresa.java

@OneToMany(mappedBy = "empresa")
private List<LDiario> ldiarios;


// LDiario.java

@ManyToOne  
@JoinColumn (name = "empresa_id") 
private Empresa empresa;

empresa_id是表LDIARIO2014中列的名称,它是表empresas的外键。

我不知道这是你唯一的错误,但肯定是第一个需要纠正的错误。如果更正了这一点,那么当您从数据库获取ldiarios时,您应该获得empresa数据,但是它将显示在页面上的天气取决于您未提供的更多代码(例如empresaBean )。

无论如何,试试这个,让我们知道结果。

更新1

首先,您需要检查是否从数据库中获取ldiarios。因此,调试代码并查看empresaService.getAll()是否返回带有ldiarios的empresas(我在empresa_id中看不到LDIARIO2014,其他列是外键吗?从图像中看不清楚。)< / p>

这两个<p:dataTable>是否在同一页面上?当您在第一个表格中选择empresa时,您希望在第二个表格中看到ldiarios吗?如果是,请将empresa视图表更改为此类

<p:dataTable id="radioDT"  var="emp" value="#{empresaBean.getEmpresaList()}"  
            selection="#{empresaBean.selectedEmpresa}" rowKey="#{emp.CLAVE}">

        <p:ajax event="rowSelect" listener="#{empresaBean.selectEmpresa}"
                update="tLDiarios"/>

将第二个表格更改为

<p:dataTable id="tLDiarios" var="ld" value="#{empresaBean.selectedEmpresa.ldiarios}" rowKey="#{ld.CLAVE}">

将此添加到empresaBean

public void selectEmpresa(SelectEvent event) {
    selectedEmpresa = (Empresa) event.getObject();
}