Использование общей таблицы для ElementCollection в MappedSuperclass - PullRequest
0 голосов
/ 02 октября 2018

У меня есть 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     |
+-----------------------------+

Итак, мой вопрос: есть ли способ, при котором у меня есть только одна таблица «extra_fields», которая используется всеми сущностями?

РЕДАКТИРОВАТЬ 1: я пытался использовать атрибут имени таблицы @CollectionTable(name = "extra_fields"), который действительноимя таблицы, а не просто постфикс.Итак, теперь у меня есть одна общая таблица, но у меня по-прежнему есть один столбец идентификатора для каждой сущности:

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    |       |
+------------------------+--------------+------+-----+---------+-------+

Однако это теперь не проблема, поскольку мы не можем сохранить одну сущность без предоставления всех идентификаторов.Т.е. сохранение сущности счета вызывает исключение Caused by: java.sql.SQLException: Field 'account_list_entity_id' doesn't have a default value.Есть ли способ иметь один уникальный идентификатор для всех сущностей и только один «entity_id» в качестве ключа соединения?

РЕДАКТИРОВАТЬ 2: я добавил joinColumns=@JoinColumn(name = "id", referencedColumnName = "id"), который работает, но теперь мне нужен глобальный уникальный идентификатор для всехсущности не только по таблице сущностей.Но когда я теперь использую UUID, это действительно усложняет специальные запросы:

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

Поскольку столбцы идентификаторов теперь выглядят так:

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

Могу ли я иметь более читаемый UUID, такой какпростое число?Или я могу использовать дополнительный столбец для источника идентификатора (таблица)?

1 Ответ

0 голосов
/ 04 октября 2018

На самом деле решение заключается в использовании стратегии наследования JOINED.

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

}
...