【问题标题】:Hibernate mapping - Is it possible to get rid of one Java class?Hibernate 映射 - 是否有可能摆脱一个 Java 类?
【发布时间】:2016-06-28 16:28:16
【问题描述】:

目前我有两个表格 - ProductStatistics。还有两个 java 实体(产品、统计)
它们之间的映射是 1:1。

我想删除一个实体(统计),因为从这个实体中我只需要一个名为“magicValue”的列。

有没有办法只使用一个实体 - Product,其中包含magicValue?
(不需要统计类?)

我在考虑 OneToOne 映射或嵌入式类型的使用,但对于所有这些可能性,需要 Statistics java 类

如果我的问题不合理,请根据您的知识写出最佳解决方案。

更多详细信息:

从表 Product 我需要所有列。
从表 Statistics 我只需要一列 (MAGIC_VALUE)

Sql 表:

        CREATE TABLE PRODUCT
        (
            "PRODUCT_ID"         NUMBER(20,0),
            "NAME"               VARCHAR2(30 BYTE),
             PRIMARY KEY  (`PRODUCT_ID`)
        );


        CREATE TABLE STATISTICS
        (
            "STATISTICS_ID"         NUMBER(20,0) PRIMARY KEY,
            "PRODUCT_ID_FK"         NUMBER(20,0),
            "MAGIC_VALUE"           VARCHAR2(30 BYTE),
            "OTHER_USELESS_COLUMN"  VARCHAR2(30 BYTE),
             ...

             PRIMARY KEY  (`STATISTICS_ID`)
             FOREIGN KEY (`PRODUCT_ID_FK`) REFERENCES PRODUCT(PRODUCT_ID)
        );

当前的 java 类如下所示:

    @Entity
    @Table(name="PRODUCT")
    class Product {
        @Id
        @Column(name = "PRODUCT_ID")
        protected Integer productId;

        @Column(name = "NAME")
        protected String name;

        @OneToOne(cascade = CascadeType.ALL)
        @PrimaryKeyJoinColumn
        protected Statistics stat;
    }

这是统计 java 类
我只需要一列(magicValue)

        @Entity
        @Table(name="STATISTICS")
        class Statistics {
            @Id
            @Column(name = "STATISTICS_ID")
            protected Integer statisticsId;

            @OneToOne(mappedBy = "statistics")
            protected Product product;

            @Column(name = "MAGIC_VALUE")
            protected String magicValue; // <-- only this is needed

            @Column(name = "OTHER_USELESS_COLUMN")
            protected String uselessColumn;
            ...   
        }

所需的解决方案

  1. 没有 sql 更改
  2. 去掉 Statistics java 类(如果可能的话)
  3. 仅更改 Product java 类,例如:

    @Entity
    @Table(name="PRODUCT")
    class Product {
        @Id
        @Column(name = "PRODUCT_ID")
        protected Integer productId;
    
        @Column(name = "NAME")
        protected String name;
    
        @someHowMap to sql table Statistics, but in Product have direct magicValue value
        protected String magicValue;
    }
    


其他(次要)信息:

  • 与数据库的连接是只读的。
  • 我只使用注释(没有 cfg 文件)
  • 我没有更改 sql 架构的权限
  • 使用 Java 8 或 Scala 2.10、Hibernate 5.2



谢谢

【问题讨论】:

    标签: java hibernate hibernate-mapping


    【解决方案1】:
    @Entity
    @Table(name="PRODUCT")
    class Product {
        @Id
        @Column(name = "PRODUCT_ID")
        protected Integer productId;
    
        @Column(name = "NAME")
        protected String name;
    
        @Formula("(select MAGIC_VALUE from STATISTICS where PRODUCT_ID_FK = PRODUCT_ID)")
        protected String magicValue;
    }
    

    该公式可以使用,它使用 SQL 而不是 HQL,因此您的 Java 类中不需要 STATISTICS 的实体。

    You can see more details about the usage of @Formula here

    【讨论】:

      猜你喜欢
      • 2020-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-08
      • 2015-04-03
      相关资源
      最近更新 更多