在使用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);}
}
相关类的完整代码可以在这个链接中找到。
实体RimPerson
和rimprole
之间存在双向一对多关系。因此,您需要使用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的响应,但在数据库中找不到数据