是否有更好的方法来保持地图的价值是一组?

时间:2012-01-15 17:09:47

标签: java hibernate map

我很期待能够使用Hibernate来保存像Map<String, Set<Entity>>这样的地图而运气不佳(特别是因为我希望所有这些都在一张桌子上)。

Mapping MultiMaps with Hibernate似乎被引用最多,它详细描述了如何使用UserCollectionType来实现这一点。

我很想知道,因为这是四年前写的,现在还有更好的办法吗?

因此,举例来说,我想在EntityA上找到Map<String, Set/List<EntityB>>这样的地图。

会有两个表:EntityAEntityBEntityB将外键返回EntityA)。

我不想要任何中间表。

2 个答案:

答案 0 :(得分:1)

它在当前项目中的完成方式是我们使用xstream将bean / collections转换为xml:

public static String toXML(Object instance) {
    XStream xs = new XStream();
    StringWriter writer = new StringWriter();
    xs.marshal(instance, new CompactWriter(writer));
    return writer.toString();
}

然后在hibernate中使用Lob类型来持久化:

@Lob
@Column(nullable = false)
private String data;

我发现这种方法非常通用,你可以用它有效地实现灵活的键/值存储。您不喜欢XML格式,然后Xstream框架具有内置驱动程序,用于将对象转换为JSON。尝试一下,非常酷。

干杯

编辑:对评论的回应。 是的,如果你想克服经典方法的局限性,你可能会牺牲像索引和/或搜索这样的东西。您可以自己通过集合/通用实体bean实现索引/搜索/外部/子关系 - 只需使用您认为需要搜索的属性名称/属性值维护单独的键/值表。

我已经看到了需要灵活和动态(即创建没有停机时间的域对象的新属性)模式的产品的数据库设计数量,并且其中许多使用键/值表来存储域属性和来自所有者对象的引用孩子一个。这些产品花费了数百万美元(银行/电信),所以我猜这种设计已被证明是有效的。

很抱歉,由于您询问的是没有中间表的解决方案,因此您的原始问题无法解答。

答案 1 :(得分:-1)

取决于:)当事情变得复杂时,您应该了解您的应用程序正在做什么。

在某些情况下,您可以将Set表示为TreeSet,并将此TreeSet表示为有序编码字符串,例如[“1”,“8”,“12”],其中1,8,12是主键,然后让我们编写代码

显然,在我看来,这不是一个普遍的答案,而是一个过于笼统的问题。