【问题标题】:How to manage many to many relationships on a form with jsf如何使用jsf管理表单上的多对多关系
【发布时间】:2013-06-14 03:58:25
【问题描述】:

所以我有这些表: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 时,我的问题来了,这不是我主要关心的问题。 所以我添加了一个角色的选择菜单,其中有一个按钮,上面写着“添加一个人”,所以如果他们选择了这个角色并点击了“添加一个人按钮”,它会转到 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 和角色建立多对一的关系。我想我必须添加一个主键。但这似乎是一种解决方案,如果我们最终这样做,为什么我们会有多对多的选择。

编辑 刚找到这个,

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

【问题讨论】:

  • 您的字段名称是personas,但在mappedBy 中您使用persona,请尝试将其更改为personas 并告诉我它是否可以工作。
  • 这有点帮助,现在我在 crear 函数中发现了错误
  • 如果你有一个多对多的关系,你应该能够规范化更多并创建一个一对多的关系。
  • @Blaine,所以基本上是这样的mkyong.com/hibernate/…
  • @JuanDiego 当你持久化一个附加到一个已经存在的类的新类时会发生这个错误,尝试使用 save 方法......或者首先持久化出现然后添加角色并合并它。

标签: java hibernate jsf-2


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    感谢 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();
                }
            }
    

    【讨论】:

      猜你喜欢
      • 2010-10-14
      • 2016-01-06
      • 1970-01-01
      • 1970-01-01
      • 2022-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-26
      相关资源
      最近更新 更多