在 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.service
和com.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 注册表