在 JHipster 的 @OneToMany JPA 关系中编写孩子的问题

Posted

技术标签:

【中文标题】在 JHipster 的 @OneToMany JPA 关系中编写孩子的问题【英文标题】:issue writing children in a @OneToMany JPA relationship from JHipster 【发布时间】:2019-05-04 07:44:06 【问题描述】:

我正在尝试解决此问题,我已输入: https://github.com/jhipster/generator-jhipster/issues/9639

我做了一些工作(我在存储库中添加了 findAllWithEagerRelationships),GET 方法工作正常:我得到了所有的 master 和 children。

什么不起作用,我需要你的帮助,是 POST 方法: 当我与一些孩子(宠物)一起发布parent 时,孩子们没有与父母一起发布,所以孩子们迷路了。 所以总结这就是get结果,正确:

[
  
    "id": 1002,
    "name": "Piera",
    "pets": [
      
        "id": 1051,
        "name": "fido",
        "species": "barboncino",
        "owner": 
          "id": 1002,
          "name": "Piera"
        
      
    ]
  
]

但帖子无法正常工作:


  "name": "newName",
  "pets": [
    
      "id": 1051
    
  ]

newName 已创建,但宠物 1051 未附加到它

我正在开发一个使用 Jhipster 生成的应用程序:

entity Owner 
    name String required


entity Pet 
    name String required,
    species String required


relationship OneToMany 
    Ownerpet to Petowner

为了获取,我添加了从manytomany 关系中复制的这两个方法,它们起作用了:

@Query(value = "select distinct owner from Owner owner left join fetch owner.pets")
List<Owner> findAllWithEagerRelationships();

@Query("select owner from Owner owner left join fetch owner.pets where owner.id =:id")
Optional<Owner> findOneWithEagerRelationships(@Param("id") Long id);
    Public class Owner implements Serializable 

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
    @SequenceGenerator(name = "sequenceGenerator")
    private Long id;

    @NotNull
    @Column(name = "name", nullable = false)
    private String name;

    @OneToMany(mappedBy = "owner")
    @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
    private Set<Pet> pets = new HashSet<>();
    // jhipster-needle-entity-add-field - JHipster will add fields here, do not remove

    public class Pet implements Serializable 

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
    @SequenceGenerator(name = "sequenceGenerator")
    private Long id;

    @NotNull
    @Column(name = "name", nullable = false)
    private String name;

    @NotNull
    @Column(name = "species", nullable = false)
    private String species;

    @ManyToOne
    @JsonIgnoreProperties("pets")
    private Owner owner;

    // jhipster-needle-entity-add-field - JHipster will add fields here, do not remove

我希望当我在一个有孩子的父母上发帖时,孩子(宠物)也会被发布。

【问题讨论】:

所以您想查看的更改不在数据库中?孩子和父母是否保存到 M2M 表中? 我想要的更改已经在数据库中(因为它是由 Jhipster 创建的),并且 childd 和 parents 保存在数据库中(如下所示).....但是我有在 JAVA/JPA 代码中呈现此结构的一些问题。请找到数据库结构(由 JHIPSTER 为我创建):CREATE CACHED TABLE PUBLIC.PET(ID BIGINT NOT NULL, NAME VARCHAR(255) NOT NULL, SPECIES VARCHAR(255) NOT NULL, OWNER_ID BIGINT) CREATE CACHED TABLE PUBLIC.OWNER (ID BIGINT NOT NULL, NAME VARCHAR(255) NOT NULL) 我假设您使用的是 DTO。检查相应的DTO,有一些字段标记为ignore,删除/注释该行,它应该可以工作 您好,我没有使用 DTO,但是根据您的建议,我尝试了: ,并且没有标记为忽略的字段 - 所以我相信您的建议不起作用。此外,如上所述,Pet 类中有一个 @JsonIgnoreProperties("pets"),但如果我删除它,我会得到:无限递归异常 这就是为什么使用 DTO 是一个好主意的原因,这样您就没有无限循环,也不会传输您实际上不需要的信息。无论如何,如果您的字段没有被填充,请尝试在服务层中使用父 ID 填充。 【参考方案1】:

在您的Owner 服务接口和实现层(应该在com.yourpackage.servicecom.yourpackage.service.impl 下)创建一个新方法,如

public Optional<Owner> findOneWithChildren(long id) 
   Optional<Owner> owner = ownerRepository.findById(id);
   owner.ifPresent(o -> 
       o.getPets().addAll(petRepository.getByParentId(id);
   
   return owner.map(ownerMapper::toDto);

然后在您的Pet 存储库中,创建一个新方法,例如

List<Pet> getByParentId(long id);

【讨论】:

谢谢,但这并不能回答我的问题。我不是在寻找代码来编写所有者和宠物,而不是查询它们。我已经有两种工作方法:findAllWithEagerRelationships() 和 findOneWithEagerRelationships(),我在上面的代码中报告了。 哦,我明白你的意思了,对不起【参考方案2】:

在错误报告中,我可以在不触及 JPA 的情况下找到解决方法。我仍然不知道如何让新主人将一些宠物与 JPA 相关联,因为我确实收到了解决的答案,无论如何我的解决方法是有效的。谢谢:)

【讨论】:

以上是关于在 JHipster 的 @OneToMany JPA 关系中编写孩子的问题的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有身份验证的情况下打开我的应用程序 j hipster

JHipster - 如何在 Eclipse 中仅调试微服务架构中的一个网关(或微服务)?

jHipster 3.4 创建最流行Java Web应用项目最简单的入门基本教程

JHipster - 在 AWS Beanstalk 中发布部署 Jhipster 注册表

yo 在 yarn global add generator-jhipster 后找不到 jhipster

更新 JHipster 生成器后如何更新 JHipster 项目?