Hibernate, похоже, не поддерживает мультикарты (вот что такое resources
) напрямую, но вы можете указать свой собственный тип, как описано здесь: https://xebia.com/blog/mapping-multimaps-with-hibernate/.
Однако, поскольку ваши данные в любом случае кажутся Json, вы можете сделать еще один шаг и напрямую отобразить ресурсы как json, то есть в текстовый столбец (или столбец json, если база данных поддерживает его): http://fabriziofortino.github.io/articles/hibernate-json-usertype/
Мы делаем что-то похожее, что на схеме выглядит примерно так (это общий тип, в большинстве случаев более конкретный POJO будет лучше):
class JsonData extends HashMap<String, Object> { ... }
//JsonbUserType is a custom implementation based on code like the one linked above
class JsonDataUT extends JsonbUserType<JsonData > { ... }
Тогда вpackage-info.java
пакета, в котором находится пользовательский тип, у нас есть это:
@TypeDefs ( {
@TypeDef ( name = "JsonDataUT ", typeClass = JsonDataUT.class, defaultForType = JsonData.class ),
...
})
package our.package;
И тогда наши сущности просто содержат это:
@Column( name = "data_column")
private JsonData data;
Одним из преимуществ этого является то, что мы нене нужно беспокоиться о более сложных сопоставлениях, особенно если типы являются динамическими.
Один (главный) недостаток, однако, заключается в том, что вы не можете использовать это свойство в условиях запроса, поскольку Hibernate не знает, как фильтроватьв столбце json (мы используем Postgres, так что это действительно столбец с типом jsonb, отсюда и имя типа пользователя), и на самом деле нет разумного способа предоставить пользовательские функции и т. д. для включения таких вещей, как where data.someFlag is true
в HQL.