【问题标题】:JPA many-to-one with constant values in referenced tableJPA 多对一与引用表中的常量值
【发布时间】:2015-06-01 10:43:47
【问题描述】:

我正在做 Spring Boot 项目并使用 spring-boot-jpa(Hibernate 实现)。我在配置实体之间的以下关系时遇到问题。

假设我需要两个表之间的多对一(和反向一对多)关系(本例中为 MySQL,table1 逻辑上将代码描述存储在各种其他表中):

CREATE TABLE `table1` (
   `id` INT NOT NULL AUTO_INCREMENT,
   `ref_table` VARCHAR(50) NOT NULL,
   `ref_column` VARCHAR(50) NOT NULL,
   `code` VARCHAR(10) NOT NULL,
   `description` VARCHAR(100) NOT NULL,
   PRIMARY KEY (`id`),
   UNIQUE INDEX `u_composite1` (`ref_table` ASC, `ref_column` ASC, `code` ASC));

CREATE TABLE `table2` (
   `id` INT NOT NULL AUTO_INCREMENT,
   `field1` VARCHAR(100) NULL,
   `code` VARCHAR(10) NOT NULL,
   PRIMARY KEY (`id`));

我在SQL中加入这两个表的方式是这样的:

SELECT t2.*, t1.description 
FROM table2 t2 
JOIN table1 t1 
  ON    ( t1.ref_table = 'table2'
      AND t1.ref_column = 'code' 
      AND t1.code = t2.code);

所以,我创建了这样的实体(减去 getter 和 setter):

@Entity
@Table(name = "table1")
public class Table1  implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(unique = true, nullable = false)
    private int id;

    @Column(nullable = false, length = 10)
    private String code;

    @Column(length = 100)
    private String description;

    @Column(name = "ref_column", nullable = false, length = 50)
    private String refColumn;

    @Column(name = "ref_table", nullable = false, length = 50)
    private String refTable;

    @OneToMany(mappedBy = "table1")
    private List<Table2> table2;
}

@Entity
@Table(name = "table2")
public class Table2  implements Serializable {
    private static final long serialVersionUID = 1L;

   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   @Column(unique = true, nullable = false)
   private int id;

   @Column(nullable = false, length = 45)
   private String field1;

   @ManyToOne(fetch=FetchType.LAZY)
   @Column(name = "code")
   @JoinColumns({
      @JoinColumn(name = "code", referencedColumnName = "code", nullable = false, updatable = false),
      @JoinColumn(name = "'table2'", referencedColumnName = "ref_table", nullable = false, updatable = false),
      @JoinColumn(name = "'code'", referencedColumnName = "ref_column", nullable = false, updatable = false)
   })
   private Table1 table1;

}

但它不起作用。 :(

这种关系甚至可以在 JPA 中定义吗? 如果有,请问怎么做?

【问题讨论】:

    标签: java mysql hibernate jpa spring-boot


    【解决方案1】:

    关于“使用常量值加入”问题,我设法使用@Where Hibernate 注释使其工作:

    • How to replace a @JoinColumn with a hardcoded value?

      @Entity
      @Table(name = "a")
      public class A {
          @Id
          @GeneratedValue(strategy = GenerationType.AUTO)
          public long id;
      
          @OneToMany
          @JoinColumn(name = "id", referencedColumnName = "id")
          @Where(clause = "blah = 'CONSTANT_VALUE'")
          public Set<B> b;
      
          protected A() {}
      }
      
      @Entity
      @Table(name = "b")
      public class B {
          @Id
          @Column(nullable = false)
          public Long id;
      
          @Column(nullable = false)
          public String blah;
      
          protected B() {}
      }
      

    【讨论】:

      猜你喜欢
      • 2021-08-23
      • 2013-04-13
      • 1970-01-01
      • 1970-01-01
      • 2018-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-06
      相关资源
      最近更新 更多