繁体   English   中英

不保存子实体

[英]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);}
}

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

您在实体RimPersonRimRole之间具有双向的一对多关系。 因此,您需要使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM