[英]not saving child entity
在使用hibernate和jpa的spring mvc项目中,我有一个person
实体和一个role
实体。 每个person
可以有多个roles
,但每个role
只能有一个person
。 如何为现有person
保留新role
?
我已经读了很多关于此的文章。 如果尝试保存新role
,则会收到有关无法保存分离的实体的错误消息。 但是,如果我尝试保存现有person
,则不会保存该角色。 我阅读了这篇帖子,建议将休眠注释移至吸气剂,但这样做时,我收到了一个引用未知属性的休眠映射错误。 这篇文章说新错误的解决方案是将注释移回吸气剂,而无需提及导致分离的实体错误。 因此,各种堆栈溢出问题似乎是一个圆圈。 那么,如何解决我的代码以实际保存新的子实体呢?
这是人:
@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
和RimRole
之间具有双向的一对多关系。 因此,您需要使用mappedBy
属性告诉hibernate哪个是关联的所有者,在one-to-many
关系的情况下, many
被视为关联的所有者,因此在RimPerson
,映射应如下所示:
@OneToMany(targetEntity = RimRole.class, mappedBy="player", cascade = {CascadeType.ALL
}, fetch = FetchType.EAGER)
private List<RimRole> playedRoles;
请注意,我们必须从此处删除@JoinColumn
批注。 此外,mappedBy属性的值应与您在RimRole
中定义的属性名称player
匹配。
现在,对于双向关联,您需要从实体的两侧设置属性,这意味着:
rimPerson.setPlayedRoles(playedRoles);
rimRole.setPlayer(player);
尝试使用这些更改来更新代码并运行应用程序,这应该可以解决问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.