我用Sping Boot + Hibernate + PostgreSQL做了一个互联网鞋店,有表Goods with information about shoe和Sizes table,其中包含有关具体鞋子尺寸和库存数量的信息。因此,商品表将包含有关其尺寸的信息。Table Sizes包含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;
返回商品列表的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 architectureJSON response w/o info about sizes
我尝试使用复杂的查询hql代码,并使用多个hibernate注解,但没有什么好的发生。。
1条答案
按热度按时间yyyllmsg1#
你在
sizes
属性中有@JsonBackReference
,在Size类中有@JsonManagedReference
,进入good属性。你可以用另一个注解来更改一个注解。请参阅此链接:https://www.baeldung.com/jackson-bidirectional-relationships-and-infinite-recursion@JsonManagedReference是reference的前向部分,也就是被序列化的部分。
@JsonBackReference为引用的后面部分;序列化时会省略。
如果在某些情况下需要显示Size对象及其良好的相关属性,则可以创建SizeDto,并且可以在其中包含不同的注解。