hibernate - 如何从休眠中的多对多关系中检索数据?
问题描述
我有四个表,如下图所示。
餐厅和品类之间的关系是多对多的。为此,正在使用名为 restaurant_category 的新表。我将餐厅和类别之间的关系设置如下。
RestaurantEntity.java
=================
package com.upgrad.FoodOrderingApp.service.entity;
import javax.persistence.*;
import javax.validation.constraints.Size;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
@Entity
@Table(name = "restaurant")
@NamedQueries(
{ @NamedQuery(name = "getAllRestaurants", query = "select res from RestaurantEntity res")
}
)
public class RestaurantEntity implements Serializable {
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(name = "UUID")
@Size(max = 200)
private UUID uuid;
@Column(name = "restaurant_name")
@Size(max = 50)
private String restaurantName;
@Column(name = "photo_url")
@Size(max = 225)
private String photoURL;
@Column(name = "customer_rating")
private BigDecimal customeRating;
@Column(name = "average_price_for_two")
private Integer avgPriceForTwo;
public List<CategoryEntity> getCategories() {
return categories;
}
public void setCategories(List<CategoryEntity> categories) {
this.categories = categories;
}
@Column(name = "number_of_customers_rated")
private Integer numbrOfCustomersRated;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "address_id")
private AddressEntity addressEntity;
@ManyToMany(cascade=CascadeType.ALL)
@JoinTable(name="restaurant_category", joinColumns={@JoinColumn(referencedColumnName="ID")}
, inverseJoinColumns={@JoinColumn(referencedColumnName="ID")})
private List<CategoryEntity> categories = new ArrayList<>();
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public UUID getUuid() {
return uuid;
}
public void setUuid(UUID uuid) {
this.uuid = uuid;
}
public String getRestaurantName() {
return restaurantName;
}
public void setRestaurantName(String restaurantName) {
this.restaurantName = restaurantName;
}
public String getPhotoURL() {
return photoURL;
}
public void setPhotoURL(String photoURL) {
this.photoURL = photoURL;
}
public BigDecimal getCustomeRating() {
return customeRating;
}
public void setCustomeRating(BigDecimal customeRating) {
this.customeRating = customeRating;
}
public Integer getAvgPriceForTwo() {
return avgPriceForTwo;
}
public void setAvgPriceForTwo(Integer avgPriceForTwo) {
this.avgPriceForTwo = avgPriceForTwo;
}
public Integer getNumbrOfCustomersRated() {
return numbrOfCustomersRated;
}
public void setNumbrOfCustomersRated(Integer numbrOfCustomersRated) {
this.numbrOfCustomersRated = numbrOfCustomersRated;
}
public AddressEntity getAddressEntity() {
return addressEntity;
}
public void setAddressEntity(AddressEntity addressEntity) {
this.addressEntity = addressEntity;
}
}
CategoryEntity.java
================
package com.upgrad.FoodOrderingApp.service.entity;
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import javax.persistence.*;
import javax.validation.constraints.Size;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
@Entity
@Table(name = "category")
public class CategoryEntity implements Serializable {
@Id
@Column(name = "ID")
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Integer id;
@Column(name = "UUID")
@Size(max = 200)
public UUID uuid;
public List<RestaurantEntity> getRestaurants() {
return restaurants;
}
public void setRestaurants(List<RestaurantEntity> restaurants) {
this.restaurants = restaurants;
}
@Column(name = "CATEGORY_NAME")
@Size(max = 255)
public String category_name;
@ManyToMany(mappedBy="categories")
private List<RestaurantEntity> restaurants = new ArrayList<>();
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public UUID getUuid() {
return uuid;
}
public void setUuid(UUID uuid) {
this.uuid = uuid;
}
public String getCategory_name() {
return category_name;
}
public void setCategory_name(String category_name) {
this.category_name = category_name;
}
@Override
public boolean equals(Object obj) {
return new EqualsBuilder().append(this, obj).isEquals();
}
@Override
public int hashCode() {
return new HashCodeBuilder().append(this).hashCode();
}
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
}
}
我还在 RestaurantEntity 中使用了 namedQuery,如下所示,
@NamedQueries(
{ @NamedQuery(name = "getAllRestaurants", query = "select res from RestaurantEntity res")
}
)
此命名查询返回餐厅所需的所有数据及其相关对象地址。但它不返回其相关类别的数据。我在设置餐厅和类别之间的关系时做错了什么吗?请指导我。
所以我的期望是命名查询也应该返回相关类别的数据。
注意:在终端我得到以下错误,
org.postgresql.util.PSQLException:错误:列 categories0_.categories_id 不存在
解决方案
您必须通过添加连接列名称来更正映射:
@ManyToMany(cascade=CascadeType.ALL)
@JoinTable(name="restaurant_category", joinColumns={@JoinColumn(name = "RESTAURANT_ID", referencedColumnName="ID")}
, inverseJoinColumns={@JoinColumn(name = "CATEGORY_ID", referencedColumnName="ID")})
private List<CategoryEntity> categories = new ArrayList<>();
推荐阅读
- linux - 如何在终端中使输入和输出颜色不同?
- javascript - 如何通过连接所有字符串来折叠数组,但保留对象
- python - 在 Python 中从 LastFM API 处理日期
- python - 使用 pip 时找不到匹配的分布
- python - 导入 Tensorflow 时内核死机
- python - 使用 subprocess.run() 后是否必须关闭标准输出
- c# - 在 ASP.NET Core Windows 身份验证应用程序中保护 SQL 连接字符串
- python - 构建时文件未正确从主机复制到 Docker 容器(即使使用 –no-cache 标志)
- ios - Swift UITabBarController,保存订单标签
- python - 成对显示抓取的信息