【问题标题】:Hibernate map an association as a mapHibernate 将关联映射为映射
【发布时间】:2018-09-20 13:19:14
【问题描述】:

我有一个包含资源列表的 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]

有人可以帮我解决这个问题吗?

【问题讨论】:

标签: java hibernate persistence


【解决方案1】:

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 类型列,因此是用户类型名称)并且 afaik 没有合理的方法来提供自定义函数等以在 HQL 中启用诸如 where data.someFlag is true 之类的东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-14
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多