У меня есть четыре таблицы, как показано на диаграмме ниже.
Отношение между рестораном и категорией "многие ко многим".Для этого используется новая таблица с именем 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);
}
}
Также я использовал namedQuery в RestaurantEntity, как показано ниже,
@NamedQueries(
{ @NamedQuery(name = "getAllRestaurants", query = "select res from RestaurantEntity res")
}
)
Этот namedQuery возвращает все данные, необходимые для ресторанов, и связанный с ним объект -адрес.Но он не возвращает данные для связанных категорий.Я делаю что-то не так в установлении отношений между ресторанами и категориями?Пожалуйста, помогите мне.
Так что я ожидаю, что именованный запрос должен также возвращать данные для связанных категорий.
Примечание: В терминале я получаю ошибку ниже,
org.postgresql.util.PSQLException: ОШИБКА: столбец category0_.categories_id не существует