代码之家  ›  专栏  ›  技术社区  ›  KIC

为MappedSuperclass中的ElementCollection使用共享表

  •  0
  • KIC  · 技术社区  · 6 年前

    我有一个 MappedSuperclass 在这里,我还存储了一个类似这样的收藏:

    @Data
    @MappedSuperclass
    public abstract class EntityMetaData {
    
        @Id
        @GeneratedValue
        private Long id;
    
        @Column(length = 150, nullable = false)
        private String runId;
    
        @CollectionTable
        @ElementCollection(fetch = EAGER)
        @MapKeyColumn(length = 50)
        Map<String, String> extraFields;
    }
    

    现在,正如我所期望的,对于每个继承的实体,我都会得到一个单独的表:

    +-----------------------------+
    | Tables_in_foo3              |
    +-----------------------------+
    | account_list                |
    | account_list_extra_fields   |
    | score_list                  |
    | score_list_extra_fields     |
    +-----------------------------+
    

    所以我的问题是,我有一种方法,我只有一个“额外的字段”表,它是所有实体共享的。

    编辑1: @CollectionTable(name = "extra_fields") 它实际上是一个表名,而不仅仅是后缀。因此,现在我有一个共享表,但每个实体仍有一个ID列:

    MariaDB [(none)]> desc foo3.extra_fields;
    +------------------------+--------------+------+-----+---------+-------+
    | Field                  | Type         | Null | Key | Default | Extra |
    +------------------------+--------------+------+-----+---------+-------+
    | score_list_id          | bigint(20)   | NO   | MUL | NULL    |       |
    | a_string               | varchar(255) | YES  |     | NULL    |       |
    | extra_fields_key       | datetime     | NO   | PRI | NULL    |       |
    | account_list_id        | bigint(20)   | NO   | MUL | NULL    |       |
    +------------------------+--------------+------+-----+---------+-------+
    

    然而,这现在不是工作,因为我们不能存储一个实体,而不提供所有的ID。也就是说,存储一个得分实体会引发异常 Caused by: java.sql.SQLException: Field 'account_list_entity_id' doesn't have a default value . 有没有办法让所有实体都有一个唯一的ID,而只有一个“实体\u ID”作为联接键?

    编辑2: 我补充说 joinColumns=@JoinColumn(name = "id", referencedColumnName = "id") 这是工作,但现在我需要一个全局唯一的Id为所有实体不仅每个实体表。但是,当我现在使用uuid时,这种情况使得临时查询变得困难:

    @Id
    @GeneratedValue(generator = "uuid2")
    @GenericGenerator(name = "uuid2", strategy = "uuid2")
    @Column(columnDefinition = "BINARY(16)")
    private UUID id;
    

    | id               |
    +------------------+
    | �N����E���%�_o�� | 
    

    我可以有一个更可读的UUID像一个普通的数字吗?或者我可以使用一个额外的列作为id的来源(表)?

    1 回复  |  直到 6 年前
        1
  •  0
  •   KIC    6 年前

    实际上,解决方法是使用继承策略。

    @Data
    @Entity
    @Inheritance(strategy = InheritanceType.JOINED)
    public abstract class EntityMetaData {
    
        @Id
        @GeneratedValue
        private Long id;
    
        @Column(length = 150, nullable = false)
        private String traceId;
    
        @CollectionTable(name = "unknown_fields", joinColumns=@JoinColumn(name = "id", referencedColumnName = "id"))
        @ElementCollection(fetch = EAGER)
        @MapKeyColumn(length = 50)
        Map<String, String> unknown;
    
    }