我有一个
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的来源(表)?