如何使用jsf管理表单上的多对多关系

时间:2013-06-18 04:07:29

标签: java hibernate jsf-2

所以我有这些表:ocurrencia和persona,他们有很多关系。该表称为识别。我正在使用休眠。

这是ocurrencia上的代码

@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinTable(name = "identificacion", joinColumns = { 
        @JoinColumn(name = "id_ocurrencia", nullable = false, updatable = false) }, 
        inverseJoinColumns = { @JoinColumn(name = "id_persona", 
                nullable = false, updatable = false) })
private List<Persona> personas

这是人物角色上的代码

// bi-directional many-to-one association to Identificacion
    @ManyToMany(fetch = FetchType.LAZY, mappedBy = "persona")
    private List<Ocurrencia> ocurrenciasIdentificacion;

我尝试在Ocurrencia上使用Fetchtype Lazy,但我遇到了一些问题,所以我使用了EAGER。我也应该在角色上使用EAGER吗?那么当我试图保存ocurrencia时,我的主要问题不是我的问题。 所以我添加了一个人物角色的selectonemenu,其按钮上写着“添加一个人”,所以如果他们选择角色并且他们点击“添加一个人按钮”就会转到ocurrencia.getPersonas()。add(newPersona) 并且它在表格上正确显示(在点击保存之前),当我编辑我以前录制的任何一个ocurrencias时,它就像一个魅力,但当我创建一个新的Ocurrencia时,我没有得到错误但是每个事情都崩溃了,它没有在数据库中插入任何新记录。

当我试图添加一个没有人物角色的新ocurrencia并且它有效时,我正在失去理智,它出现在我的数据库中。所以我认为它无法在表标识上插入任何内容,因为它没有来自ocurrencia的主键。

这是我的GenericDao函数,它创建表的新记录

public void crear(final T o)throws EntidadNoGrabadaException{
        try {
            em.persist(o);
        } catch (final PersistenceException e)  {
            throw new EntidadNoGrabadaException("Error al grabar: ".concat(o
                    .toString()), e);
        }
    }

我能想到的唯一解决方案是手动创建一个用于识别的模型类,并与ocurrencia和persona建立多对一的关系。我想我必须添加一个主键。但这似乎是一种解决方案,如果我们最终做到这一点,为什么我们有多对多的选择。

EDIT 我刚发现了这个,

http://www.mkyong.com/hibernate/hibernate-many-to-many-example-join-table-extra-column-annotation/

我没有关于识别的额外专栏,这是解决这个问题的唯一方法吗? 感谢

更新

我将mappedby =“persona”更改为mappedby =“personas”现在我正在捕捉此错误

23:27:20,334 ERROR [stderr] (http-localhost-127.0.0.1-8080-6) ec.edu.puce.biologia.excepciones.EntidadNoGrabadaException: Error al grabar: ec.edu.puce.biologia.model.Ocurrencia@22231361 persistence error org.hibernate.PersistentObjectException: detached entity passed to persist: ec.edu.puce.biologia.model.Persona
23:27:20,335 ERROR [stderr] (http-localhost-127.0.0.1-8080-6)   at ec.edu.puce.biologia.dao.impl.GenericDao.crear(GenericDao.java:68)
23:27:20,335 ERROR [stderr] (http-localhost-127.0.0.1-8080-6)   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
23:2

2 个答案:

答案 0 :(得分:1)

发生此错误的原因是您持久保存附加到已存在对象的新对象。 在将crear添加到列表之前,调用ocurrence对象中的personas方法。

答案 1 :(得分:0)

所以我感谢fmodos,

我添加了一个人物角色的tmpList并将列表设置为null,然后再将列表添加到ocurrencia并在创建后更新(actualizar)我的列表。

List<Persona> tmpIdentificadores = new ArrayList<Persona>();
        if(ocurrencia.getPersonas()!=null){
            tmpIdentificadores = ocurrencia.getPersonas();
            ocurrencia.setPersonas(null);
            try {
                ocurrenciaDao.crear(ocurrencia);
            } catch (EntidadNoGrabadaException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            ocurrencia.setPersonas(tmpIdentificadores);
            actualizar(ocurrencia);
        }else{
            try {
                ocurrenciaDao.crear(ocurrencia);
            } catch (EntidadNoGrabadaException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }