Java JPA级联更新错误。我这样做不对吗?

Java JPA级联更新错误。我这样做不对吗?,java,swing,jpa,persistence,derby,Java,Swing,Jpa,Persistence,Derby,我正在JAVA中的SWING应用程序上使用JPA,该应用程序连接到ApacheDerby嵌入式数据库。我使用Netbeans作为我的IDE,并使用许多“据说”有用的模板。我的问题很简单,但我很难解释,所以我会将相关代码粘贴在这里,并尝试在底部解释 @Entity public class AnioLectivo implements Serializable, Comparable { @Id @GeneratedValue(strategy = Generation

我正在JAVA中的SWING应用程序上使用JPA,该应用程序连接到ApacheDerby嵌入式数据库。我使用Netbeans作为我的IDE,并使用许多“据说”有用的模板。我的问题很简单,但我很难解释,所以我会将相关代码粘贴在这里,并尝试在底部解释

@Entity  
public class AnioLectivo implements Serializable, Comparable  
{  
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
...  
    @OneToMany(mappedBy = "anioLectivo", cascade=CascadeType.ALL)  
    private List<Compensatorio> compensatorios;  
...  
}  

@Entity  
public class Compensatorio implements Serializable   
{  
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
...
    @ManyToOne  
    private AnioLectivo anioLectivo;  
...  
}  
在我看来,问题发生在AnioLectivoJpaController的编辑方法中的这行代码中:

em.getReference(compensatoriosNewCompensatorioToAttach.getClass(),
                compensatoriosNewCompensatorioToAttach.getId());
为什么??如果您看到实体,我已经定义了所有实体的id都将由持久化单元生成,但是只有当实体本身被告知要持久化时才会发生这种情况。在创建Compensatorio实例时,我从未显式设置id,当它到达我在上面引用的那一行时,compensatoriosNewcompensatorioAttach.getId()返回null

据我所知,ORM就像JPA一样具有可访问性的持久性,这允许如果对象A与对象B相关,持久化A也会持久化B。但在这种情况下,它似乎以一种非常不方便的方式实现(至少对我而言),因为它迫使我显式地持久化集合中的每个对象,而持久化拥有该集合的对象更有用,然后自动持久化该集合中的对象

有什么我做错了吗?也许我应该从另一个角度来面对这个问题,但我不知道如何,或者如果有,是从什么角度?。为什么netbeans的人会这样做,为什么执行这种方法来搜索数据库中的对象并将其带到持久性上下文中是有用的,我需要自己持久化每个对象吗?如果是这样的话,如果持久性只能在一个方向上实现,那么为什么他们声称具有通过可达性实现的持久性呢


我在这一点上显然是错的,我寻求的是一个连贯的解释,说明如何明确这些实体之间的关系(如果我在创建它们的方式上确实犯了一个错误,因为在我读的每本书和教程中都是这样做的),以使它起作用,这样我就不需要坚持收藏的每一个对象,或者,如果我需要从netbeans中删除该模板并自己编写所有CRUD操作的代码,我希望听到关于在这种情况下如何方便地进行操作的建议。

似乎可以调用
em.merge(anioLectivo)
,而不用这些代码

java.lang.IllegalArgumentException: An instance of a null PK has been incorrectly provided for this find operation.
        at oracle.toplink.essentials.internal.ejb.cmp3.base.EntityManagerImpl.findInternal(EntityManagerImpl.java:309)
        at oracle.toplink.essentials.internal.ejb.cmp3.EntityManagerImpl.getReference(EntityManagerImpl.java:176)
        at org.sigeb.local.service.dao.jpa.AnioLectivoJpaController.edit(AnioLectivoJpaController.java:113)
        at org.sigeb.local.views.datosIniciales.AdministrarCursosPopUp.guardarCambios(AdministrarCursosPopUp.java:574)
        at org.sigeb.local.views.datosIniciales.AdministrarCursosPopUp.jBGuardarCambiosActionPerformed(AdministrarCursosPopUp.java:394)
        at org.sigeb.local.views.datosIniciales.AdministrarCursosPopUp.access$1000(AdministrarCursosPopUp.java:44)
        at org.sigeb.local.views.datosIniciales.AdministrarCursosPopUp$11.actionPerformed(AdministrarCursosPopUp.java:204)
        at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
        at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
...
em.getReference(compensatoriosNewCompensatorioToAttach.getClass(),
                compensatoriosNewCompensatorioToAttach.getId());