当前位置: 首页 > 知识库问答 >
问题:

传递给持久化JPA Spring Boot保存的分离实体

益何平
2023-03-14
@Entity
@Table(name = "NPRO_USUARIOS")
public class User implements Serializable {

    private static final long serialVersionUID = -1330075515340995797L;

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO, generator="user_seq_gen")
    @SequenceGenerator(name="user_seq_gen", sequenceName="TELCO_NPRO_USER_SEQ")
    @NotNull
    private int id_usuario;

    @NotNull
    private String nombre_usuario;

    @ManyToMany(cascade = {CascadeType.PERSIST,CascadeType.REMOVE, CascadeType.MERGE, CascadeType.DETACH, CascadeType.REFRESH })
    @JoinTable(name = "NPRO_USUARIOS_SOCIEDADES_AREAS", joinColumns = @JoinColumn(name = "id_usuario"), inverseJoinColumns = @JoinColumn(name = "id_sociedad"))
    private Set<Sociedad> listaSociedad;

    @Transient
    private String sociedades;

    // Si el area es nula, el usuario estara asignado a todas las areas
    @ManyToMany(cascade = {CascadeType.PERSIST,CascadeType.REMOVE, CascadeType.MERGE, CascadeType.DETACH, CascadeType.REFRESH })
    @JoinTable(name = "NPRO_USUARIOS_SOCIEDADES_AREAS", joinColumns = @JoinColumn(name = "id_usuario"), inverseJoinColumns = @JoinColumn(name = "id_area"))
    private Set<Area> listAreas;

    @Transient
    private String areas;

    @NotNull
    private String matricula_usuario;

    @NotNull
    private String email_usuario;

    @ManyToMany(cascade = { CascadeType.MERGE, CascadeType.DETACH, CascadeType.REFRESH })
    @JoinTable(name = "NPRO_PERFILES_USUARIOS", joinColumns = @JoinColumn(name = "id_usuario"), inverseJoinColumns = @JoinColumn(name = "id_rol"))
    private Set<Role> listaRoles;

    @ManyToMany(cascade = { CascadeType.MERGE, CascadeType.DETACH, CascadeType.REFRESH })
    @JoinTable(name = "NPRO_PERFILES_USUARIOS", joinColumns = @JoinColumn(name = "id_usuario"), inverseJoinColumns = @JoinColumn(name = "id_pantalla"))
    private Set<Pantalla> listaPantallas;

    private LocalDateTime fecha_ultimo_acceso;
    private String observaciones;

    @JsonIgnore
    @ManyToOne
    @JoinColumn(name = "usuario_modif")
    private User usuario_modif;
}
@Entity
@Table(name = "NPRO_MAESTRO_SOCIEDADES")
public class Sociedad implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @NotNull
    private int id_sociedad;
    @NotNull
    private String cod_sociedad;
    @NotNull
    private String cod_sociedad_gl;
    @NotNull
    private String nombre_sociedad;
    @NotNull
    private String cif_sociedad;
    private String observaciones;

    @JsonIgnore
    @ManyToOne
    @JoinColumn(name = "usuario_modif")
    private User usuario_modif;

    private String activo;

    @JsonIgnore
    @ManyToMany(cascade = {CascadeType.PERSIST,CascadeType.REMOVE, CascadeType.MERGE, CascadeType.DETACH, CascadeType.REFRESH })
    @JoinTable(name = "NPRO_USUARIOS_SOCIEDADES_AREAS", joinColumns = @JoinColumn(name = "id_sociedad"), inverseJoinColumns = @JoinColumn(name = "id_usuario"))
    private Set<User> listaUsuarios;
}
@Entity
@Table(name = "NPRO_MAESTRO_AREAS")
public class Area implements Serializable {

    private static final long serialVersionUID = -1330075515340995797L;
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO, generator="area_seq_gen")
    @SequenceGenerator(name="area_seq_gen", sequenceName="TELCO_NPRO_AREAS_SEQ")
    @NotNull
    private int id_area;

    @NotNull
    private String nombre_area;

    private LocalDateTime fecha_modif;
    private String observaciones;

    @JsonIgnore
    @ManyToOne
    @JoinColumn(name = "usuario_modif")
    private User usuario_modif;

    @NotNull
    private String activo;

    @ManyToOne
    @JoinColumn(name="id_sociedad")
    private Sociedad sociedad;

    @JsonIgnore
    @ManyToMany(cascade = {CascadeType.PERSIST,CascadeType.REMOVE, CascadeType.MERGE, CascadeType.DETACH, CascadeType.REFRESH })
    @JoinTable(name = "NPRO_USUARIOS_SOCIEDADES_AREAS", joinColumns = @JoinColumn(name = "id_area"), inverseJoinColumns = @JoinColumn(name = "id_usuario"))
    private Set<User> listaUsuarios;
    }

我正在使用springboot jpa存储库保存方法

@Override
public User save(User user) {

    return userRepository.save(user);
}

这是完整的错误:2020-06-09 15:49:02.371[nio-8080-exec-4]。M.M.A.ExceptionHandlerExceptionResolver:由处理程序执行导致的解析异常:org.springframework.dao.invalidDataAccessapiusageException:传递给persistent的分离实体:com.telefonica.npro.model.area;嵌套异常是org.hibernate.persistentObjectException:传递给persist:com.telefonica.npro.model.area的分离实体

提前致谢

编辑:

我在http://knowledgespleasure.blogspot.com/2015/06/condernand-detached-entity-passs-to.html这一页上读到了关于eror的内容

我想我的问题是最后一个:

另一方面,如果requirement不是在DB中添加新的子级,则应删除cascadetype.persist,并使用cascade={cascadetype.merge,cascadetype.refresh}

用户总是与公司和地区相关联的,他们已经存在,他们不会是新的。但是,如果我删除PERSIST,在commun表npro_usuarios_sociedades_areazes中插入一个id null是很麻烦的

有人帮忙吗?

共有1个答案

安星汉
2023-03-14

我将解释用户区域实体之间的@manytomany双向关系的问题。

>

  • 双向@manytomany关联应该有一个owning和mappedby端。CascadeType应该只存在于此关联的一侧。

    正如本文所解释的,您需要使双方同步,否则,您将破坏域模型关系的一致性,并且除非双方正确同步,否则不能保证实体状态转换工作。因此,User实体定义了AddAreaRemoveArea实体状态同步方法。

    因此,应该以以下方式更正用户区域@manytomany映射:

    @Entity
    @Table(name = "NPRO_USUARIOS")
    public class User implements Serializable {
       // ...
    
       @ManyToMany(cascade = {CascadeType.PERSIST,CascadeType.REMOVE, CascadeType.MERGE, CascadeType.DETACH, CascadeType.REFRESH })
       @JoinTable(name = "NPRO_USUARIOS_SOCIEDADES_AREAS", joinColumns = @JoinColumn(name = "id_usuario"), inverseJoinColumns = @JoinColumn(name = "id_area"))
       private Set<Area> listAreas;
    
       public User()
       {
          listAreas = new HashSet<>();
       }
    
       public void addArea(Area area) {
          listAreas.add(area);
          area.getUsers().add(this);
       }
    
       public void removeArea(Area area) {
          listAreas.remove(area);
          area.getUsers().remove(this);
       }
    }
    
    @Entity
    @Table(name = "NPRO_MAESTRO_AREAS")
    public class Area implements Serializable {
        // ... 
    
        @JsonIgnore
        @ManyToMany(mappedBy = "listAreas")
        private Set<User> listaUsuarios;
    }
    

    然后可以通过以下方式保存一个新用户

       User user = new User();
       // ...
       Area area1 = new Area();
       // ...
       user.addArea(area1);
    
       Area area2 = new Area();
       // ...
       user.addArea(area2);
    
       userRepository.save(user);
    

    应该对用户-社会关系进行类似的更正。

  •  类似资料:
    • 我在提交表单时遇到以下错误: org.hibernate.PersistentObjectException:传递给Persisted的分离实体:com.project.pmet.model.Account;嵌套异常为javax.persistence.persistenceException:org.hibernate.persistentObjectException:传递到persist的分

    • 问题内容: 我已经成功用hibernate写了我的第一个主要的孩子例子。几天后,我再次使用它并升级了一些库。不知道我做了什么,但是我再也无法使它运行了。有人可以帮助我找出返回以下错误消息的代码中的错误吗: hibernate映射: 编辑: InvoiceManager.java 发票.java InvoiceItem.java 编辑: 从客户端发送的JSON对象: 编辑: 一些详细信息: 我试图通

    • 这个网站上没有一个类似的问题能够解决我的问题。 错误:org.hibernate.persistentobjectexception:传递给persist:healthcheckapi.model.checks的分离实体 示例JSON健康对象: 请注意,这两个对象的ID都是自动生成的,我认为这是问题的一部分。

    • 我有一段运行时间很长的JPA+Hibernate代码,它试图在一个循环中将大量记录插入到DB中。 更奇怪的是,我可以用下面的代码在一次迭代中重现错误。“分离的实体...”第二次刷新时引发错误。那么这是否意味着第一次同花顺是没有操作的呢?

    • 我正试图实现与hibernate的许多单向关系。问题是,当我试图向数据库中添加一些值时,我遇到了以下错误: 运行时发生异常。null:InvocationTargetException:未能执行ApplicationRunner:传递给persist:dnd35cg的分离实体。模型DND类;嵌套的异常是org。冬眠PersistentObjectException:传递给persist:dnd35

    • 问题内容: 提交表单时出现此错误: org.hibernate.PersistentObjectException:分离的实体传递给持久化:com.project.pmet.model.Account; 嵌套异常是javax.persistence.PersistenceException:org.hibernate.PersistentObjectException:传递给持久对象的分离实体:c