我用Spring Boot+Hibernate+PostgreSQL制作了网上鞋店,里面有关于鞋子信息的表格Goods和包含具体鞋子尺码和库存数量信息的尺寸表.因此,摆放商品的桌子将包含有关其尺寸的信息.表大小包含商品中ID的外键,我希望Hibernate解析将包含大小的JSON

来自良好实体的关系

@Entity
@Table(name = "goods")
@JsonIdentityInfo(
        generator = ObjectIdGenerators.PropertyGenerator.class,
        property = "id")
public class Good {
    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int Id;

    @Column(name = "Title")
    private String title;

    @Enumerated(EnumType.STRING)
    @Column(name = "sex")
    private sexType sexType;

    @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.DETACH,
    CascadeType.REFRESH, CascadeType.MERGE})
    @JoinColumn(name = "ManufacturerId")
    @JsonManagedReference //-------------------------------------------------------
    Manufacturer manufacturer; //Many goods can refer to one manufacturer

    @JsonBackReference
    @OneToMany(cascade = {CascadeType.PERSIST, CascadeType.DETACH,
            CascadeType.REFRESH, CascadeType.MERGE}, mappedBy = "good")  //Uni-directional reference to size array
            //@JoinColumn(name= "goodid")
    List<Size> sizes; //Refactor to bi-directional relationship

    public void addSizeToGood(Size size) {
        if (sizes == null) sizes = new ArrayList<>();
        sizes.add(size);
        //size.setGood(this);
    }

大小实体

@Entity
@Table(name = "sizes")
@JsonIdentityInfo(
        generator = ObjectIdGenerators.PropertyGenerator.class,
        property = "id")
public class Size {
    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int Id;

    @Column(name = "Size")
    private int size;

    @Column(name = "Quantity")
    private int quantity;

    @Column(name = "goodid")
    private int goodId;

    @JsonManagedReference
    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "goodId")
    Good good;

返回商品 list 的DAO方法

@Repository
public class GoodDAOImpl implements GoodDAO{

    @Autowired
    private EntityManager entityManager;

    @Override
    @Transactional //Spring open and close transactions automatically
    public List<Good> getAllGoods() {
        Session session = entityManager.unwrap(Session.class);

        //Query<Good> query = session.createQuery("from Good", Good.class);
        Query<Good> query = (Query<Good>) entityManager.createQuery("from Good right join Size on Good.");
        List<Good> allGoods = query.getResultList();

        return allGoods;
    }
}

DB architecture. JSON response w/o info about sizes.

我试图使用复杂的查询hql代码,并使用了多个Hibernate注释,但什么都没有发生……

推荐答案

sizes个属性中有@JsonBackReference个,大小类中有@JsonManagedReference个,Good属性中有@JsonManagedReference个.您可以通过另一种注释更改另一种注释.查看此链接:https://www.baeldung.com/jackson-bidirectional-relationships-and-infinite-recursion

@JsonManagedReference是参考的前部,通常是gets serialized的前部.

@JsonBackReference是Reference的后面部分;it'll be omitted from serialization.

如果在某些情况下需要显示大小对象及其良好的相关属性,可以创建一个SizeDto,并且可以在其中包含不同的批注.

Java相关问答推荐

Java SSLocket查明客户端是否发送了证书

JsonPath在多个线程中返回错误的值

如何在Javascript中设置文本区域圆角的样式

工件部署期间出错[Tomcat 8.5.45]

是否保证在事务性块的末尾标记违反约束?

从Spring5迁移到Spring6:无法在雅加达包中找到类

当返回Mono<;Something>;时,不会调用Mono<;void>;.flatMap

如何从日志(log)行中删除包名称?

在向WebSphere中的文档添加元素时iText挂起

如何使用路径过渡方法使 node 绕圆旋转?

如何在JavaFX中制作鼠标透明stage

使用While循环打印素数,无法正常工作

当构造函数创建一个新实例时,Java为什么需要&new";

删除打印语句会影响功能...腐败在起作用?

Spring Framework6.1中引入的新RestClient是否有适合于测试的变体,就像RestTemplate和TestRestTemplate一样?

Spring Validator批注不起作用

Java中的发布/订阅-Long Live和Short Live Publisher,哪种方法是正确的?

如何将RESTAssured';S的Http标题转换为<;字符串、字符串和>的映射?

无法在Java中获取ElastiCache的AWS CloudWatch指标

如何用Micrometer&;斯普肯