因此,我有以下表格: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.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

最佳答案

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

09-11 05:25