Hibernate карта ассоциация как карта - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть класс MessengerData, который содержит список ресурсов.Это мой объект MessengerData:

"messengerData":{  
   "fr":[  
    { 
      "messengerType":"ImageCategoryTitle",
      "imageURL":"https://assets.pernod-ricard.com/uk/media_images/test.jpg"
    }
    "EN":[
    {
      "messengerType":"ImageCategoryTitle",
      "imageURL":"https://assets.pernod-ricard.com/uk/media_images/test.jpg",
    }
]

Вот как я определяю свой объект MessengerData:

@Entity
public class MessengerData
{

@Basic
@Id
@GeneratedValue(generator = "notification-system-uuid")
@GenericGenerator(name = "notification-system-uuid", strategy = "uuid")
private String messengerDataId;


@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) /* , mappedBy = "idResource" */
@JoinTable(name = HemisTablesNames.MESSENGER_RESOURCES, joinColumns = @JoinColumn(name = "idResource"),
        inverseJoinColumns = @JoinColumn(name = "messengerDataId"))
private Map<String, Set<Resource>> resources;
}

Но я получаю это исключение: Использование @OneToMany или @ManyToMany таргетингане сопоставленный класс: com.ubiant.hemis.type.MessengerData.resources [java.util.Set]

Может ли кто-нибудь помочь мне с этим?

1 Ответ

0 голосов
/ 20 сентября 2018

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...