Ваш вопрос является дискуссионным.
Это зависит от вашего отношения к модели данных. Вы можете затянуть винты и сделать это, как это было в вашем вопросе, или вы можете немного ослабить его и создать структуру ключ-значение.
Из того, что вы указали в своем вопросе, я бы выбрал ключ-значение. Поддерживать таблицу с тремя столбцами проще, чем с 18 столбцами. Таким образом, вы можете легко изменять таблицу, и вам не нужно будет писать и поддерживать объект Settings
со всеми этими полями.
Но, конечно, вы должны иметь в виду, что в некоторых случаях значения должны (или не должны) быть нулевыми, и вам придется конвертировать String в Integer и наоборот.
Так что, тем не менее, ваша жидкость будет выглядеть примерно так:
<changeSet id="foo1" author="bar">
<preConditions onFail="MARK_RAN">
<not>
<tableExists tableName="settings"/>
</not>
</preConditions>
<comment>Create settings table.</comment>
<createTable tableName="settings">
<column name="uuid" type="binary(16)">
<constraints primaryKey="true" primaryKeyName="pk_settings"/>
</column>
<column name="key" type="varchar(3)">
<constraints nullable="false"/>
</column>
<column name="value" type="varchar(255)"/>
</createTable>
</changeSet>
<changeSet id="foo2" author="bar">
<preConditions onFail="MARK_RAN">
<and>
<columnExists tableName="settings" columnName="uuid"/>
<columnExists tableName="settings" columnName="key"/>
<columnExists tableName="settings" columnName="value"/>
</and>
</preConditions>
<comment>Fill settings table with data.</comment>
<sql>
INSERT INTO settings (uuid, key, value) VALUES (uuid(), 'p1', 'value-you-need');
INSERT INTO settings (uuid, key, value) VALUES (uuid(), 'p2', 'value-you-need');
<!-- ... etc ... -->
</sql>
</changeSet>
А ваша сущность:
@Entity
@Table(name = "settings")
public class Settings {
@Id
@Column(name = "uuid")
private String uuid;
@Column(name = "key")
private String key;
@Column(name = "value")
private String value;
// getters and setters
}