Как извлечь данные из отношения многие ко многим в спящем режиме? - PullRequest
0 голосов
/ 14 июня 2019

У меня есть четыре таблицы, как показано на диаграмме ниже.

enter image description here

Отношение между рестораном и категорией "многие ко многим".Для этого используется новая таблица с именем 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 не существует

Ответы [ 2 ]

0 голосов
/ 14 июня 2019

Пожалуйста, измените имена столбцов JoinTable, как показано ниже.

@ManyToMany(cascade=CascadeType.ALL)
    @JoinTable(name="restaurant_category", joinColumns={@JoinColumn(name="restaurant_id")}
            , inverseJoinColumns={@JoinColumn(name="category_id")})
    private List<CategoryEntity> categories = new ArrayList<>();
0 голосов
/ 14 июня 2019

Необходимо исправить сопоставление, добавив имена столбцов соединения:

@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<>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...