Hibernate 将关联映射为映射
Hibernate map an association as a map
我有一个包含资源列表的 MessengerData class。这是我的对象 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 定位未映射的class:com.ubiant.hemis.type.MessengerData.resources[java.util.Set]
有人可以帮我解决这个问题吗?
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
之类的东西。
我有一个包含资源列表的 MessengerData class。这是我的对象 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 定位未映射的class:com.ubiant.hemis.type.MessengerData.resources[java.util.Set]
有人可以帮我解决这个问题吗?
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
之类的东西。