【问题标题】:Hibernate database relation annotationsHibernate 数据库关系注解
【发布时间】:2020-08-05 13:23:38
【问题描述】:

我已经为此苦苦挣扎了很长时间。我有一个包含两个表“产品”和“类别”的数据库

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

现在我正在尝试获取一个休眠连接查询,以便我可以检索让我们说 产品名称和类别名称

一个产品只属于一个类别(例如,如果产品是“黑色 T 恤”,那么“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

【问题讨论】:

    标签: java mysql hibernate jsp


    【解决方案1】:

    这是不对的

     @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;
    

    和产品

    @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

    【讨论】:

    • 非常感谢。确实是反过来的,就像你说的那样。我什至将表名更改为“类别”。现在一切正常。
    猜你喜欢
    • 1970-01-01
    • 2012-06-03
    • 2012-07-13
    • 1970-01-01
    • 2013-02-10
    • 2019-04-01
    • 2016-05-07
    • 2018-06-23
    • 2016-09-01
    相关资源
    最近更新 更多