Hibernate аннотации отношений базы данных - PullRequest
0 голосов
/ 22 апреля 2020

Я так долго боролся с этим. У меня есть база данных с двумя таблицами «продукт» и «категории»

CREATE TABLE `product` (
  `idproduct` int NOT NULL AUTO_INCREMENT,
  `idcategory` int DEFAULT NULL,
  `product_name` varchar(255) DEFAULT NULL,
  `product_category` varchar(255) DEFAULT NULL,
  `product_description` varchar(255) DEFAULT NULL,
  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
   PRIMARY KEY (`idproduct`),
   KEY `fkcat` (`idcategory`),
   CONSTRAINT `fkcat` FOREIGN KEY (`idcategory`) REFERENCES `categories` (`idcategory`)
 ) ENGINE=InnoDB AUTO_INCREMENT=149 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

CREATE TABLE `categories` (
  `idcategory` int NOT NULL AUTO_INCREMENT,
  `category_name` varchar(255) NOT NULL,
  `category_description` varchar(255) DEFAULT NULL,
  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
   PRIMARY KEY (`idcategory`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

Теперь я пытаюсь получить запрос на соединение в спящем режиме, чтобы я мог получить, скажем, product_name и category_name

One продукт относится только к одной категории (например, если продукт - «черная футболка», его значение для столбца «idcategory» будет равно 2. Это обеспечивается внешним ключом. Записи категорий таблиц могут быть связаны с более чем один продукт (например, "category_name" = 2 может быть связан со многими продуктами.

Как этот дизайн может быть реализован в спящих объектах? Я пробовал это, но не работает ...

@Entity
@Table(name = "product")
public class Product implements Serializable{
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "idproduct")
    private int idproduct;
    @Column(name = "idcategory")
    private int idcategory;
    @Column(name = "product_name")
    private String productName;
    @Column(name = "product_description")
    private String productdescription;
    @Column(name = "product_category")
    private String productcategory;
    @OneToMany(targetEntity = Categories.class, cascade = CascadeType.ALL)
    @JoinColumn(name = "idcategory",referencedColumnName="idcategory")
    private List<Categories> category;

@Entity
@Table(name = "categories")
public class Categories {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "idcategory")
    private int idcategory;
    @Column(name = "category_name")
    private String category_name;
    @Column(name = "category_description")
    private String category_description;

и запрос

SELECT p, c FROM Product p INNER JOIN p.category c

1 Ответ

1 голос
/ 22 апреля 2020

это не правильно

 @OneToMany(targetEntity = Categories.class, cascade = CascadeType.ALL)
 @JoinColumn(name = "idcategory",referencedColumnName="idcategory")
 private List<Categories> category;

Продукт не может иметь много категорий ... на самом деле все наоборот ->

@Entity
@Table(name = "categories")
public class Categories {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "idcategory")
    private int idcategory;

    @Column(name = "category_name")
    private String category_name;

    @Column(name = "category_description")
    private String category_description;

    @OneToMany(cascade = CascadeType.ALL, mappedBy="category")
    private List<Product> products;

и Product

@Entity
@Table(name = "product")
public class Product implements Serializable{
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "idproduct")
    private int idproduct;
    @Column(name = "idcategory")
    private int idcategory;
    @Column(name = "product_name")
    private String productName;
    @Column(name = "product_description")
    private String productdescription;
    @Column(name = "product_category")
    private String productcategory;
    @ManyToOne
    private Categories categories;

Предложение: переименовать Categories в Category

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...