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

不保存子实体

谭京
2023-03-14

在使用hibernate和jpa的spring mvc项目中,我有一个个人实体和一个角色实体。每个可以有许多角色,但每个角色只能有一个。如何为现有的人员保存新的角色

我读过很多关于这个的帖子。如果我试图保存新的角色,就会出现无法保存分离实体的错误。但如果我试图保存现有的人员,则不会保存该角色。我读了这篇帖子,建议将hibernate注释移动到getter,但当我这样做时,我会收到一个引用未知属性的hibernate映射错误。这篇帖子说,新错误的解决方案是将注释移回getter,但没有提到这会导致分离实体错误。因此,各种堆栈溢出问题似乎指向一个圆圈。那么,如何修复代码以实际保存新的子实体呢?

下面是这个人:

@Entity(name = "RimPerson")
@Table(name = "rim_person")
public class RimPerson {

    @Id
    @Column(name="hppid")
    @GenericGenerator(name = "generator", strategy = "native")
    @GeneratedValue(generator = "generator")
    private Long hppid;

    @OneToMany(targetEntity = RimRole.class, cascade = {CascadeType.ALL
    }, fetch = FetchType.EAGER)
    @JoinColumn(name = "player_rimperson_HJID")
    private List<RimRole> playedRoles;

    //other properties and getters and setters
}

其作用是:

@Entity(name = "RimRole")
@Table(name = "rim_role")
public class RimRole {

    @Id
    @Column(name="hppid")
    @GenericGenerator(name = "generator", strategy = "native")
    @GeneratedValue(generator = "generator")
    private Long hppid;

    @ManyToOne(targetEntity = RimPerson.class, cascade = {CascadeType.ALL
    }, fetch = FetchType.LAZY)
    @JoinColumn(name = "player_rimperson_HJID", nullable=true)
    private RimPerson player;  

    //other stuff and getters and setters

}  

以下是存储库层中的JPQL:

@Override
public void saveRIMPerson(RimPerson myperson) throws DataAccessException{
    if (myperson.getHppid() == null) {this.em.persist(myperson);}
    else {this.em.merge(myperson);}
}

相关类的完整代码可以在这个链接中找到。

共有1个答案

简成仁
2023-03-14

实体RimPersonrimprole之间存在双向一对多关系。因此,您需要使用mappedBy属性告诉hibernate哪个是关联的所有者,在one-to-many关系中,many方被视为关联的所有者,因此在RimPerson中,映射应该是这样的:

 @OneToMany(targetEntity = RimRole.class, mappedBy="player", cascade = {CascadeType.ALL
    }, fetch = FetchType.EAGER)
    private List<RimRole> playedRoles;

请注意,我们必须从这里删除@JoinCol列注释。另外,mappdBy属性的值应该与您在RimRole中定义的属性名称匹配,该属性名称是player

现在,对于双向关联,您需要设置实体两侧的属性,这意味着:

rimPerson.setPlayedRoles(playedRoles);
rimRole.setPlayer(player);

尝试用这些更改更新代码并运行应用程序,这应该可以解决问题。

 类似资料:
  • 我有一个问题,Spring数据没有保存实体。应用程序逻辑如下: 另一个应用程序正在监听负载相当重的Kafka主题(每秒数十条消息)并将消息插入数据库中具有“NEW”状态的表中。 @调度方法加载一个具有“NEW”状态的实体列表,这些实体被一个接一个地传输到FixedThreadPool(20个线程),它们的状态设置为“PROCESSING”和一个saveAll方法调用同一个表。 这两种日志方法都显示

  • 问题内容: 我在父方使用批注具有一对一关系。现在,我想自己保存子实体。 例如,我有和作为孩子的实体,我需要保存(父的id属性设置为之后的课程)。但是,当使用这种安排时,我在下面列出了一个例外… 为什么hibernate不允许这样做的任何想法?更清楚地说,我的代码如下… ParentEntity: ChildEntity: 我尝试保存的方式是… 关于如何尝试保存子实体,任何指针将不胜感激。 问题答案

  • 我正在尝试开发一个小型电子商务项目。我有一个篮子和篮子项目实体。我只是想当我为客户保存购物篮时,我想把购物篮项目保存在数据库中。我认为我不应该为篮子项目创建存储库。我应该能够保存篮子项目,同时使用篮子存储库保存篮子。 在这里,我试图通过篮子服务获得一个篮子项目,并将其设置为篮子实体并保存它。 我有什么问题?我有个例外。

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

  • 我正在从经典Spring 4.3.2 Hibernate(HQL)迁移到Spring Boot 1.4.1 Hibernate(JPA)HikariCP连接池,并且在批量插入方面遇到问题。我需要保存1000到527 000个元素的大列表。 当我只保存一个实体的批次,没有任何依赖项(例如:类的5000个元素)时,一切都很好。 但是,如果我尝试同时保存子实体和父实体(只需为其设置),我会得到例外: 但

  • 我在使用JPA时遇到了一些困难。我没有得到任何异常,但我不能保存任何东西到数据库。我从Hibernate到Jpa,在那里一切都工作得很好。下面是我的文件 Application.Properties: 存储库: 服务: 我在提交表单时得到了200的响应,但在数据库中找不到数据