在双向映射中获得另一方的角色

时间:2015-03-05 09:44:51

标签: java hibernate

我试图动态获取多对多映射的两个角色。我的设置是这样的(简化):

class Item {
  String name;
  Set<Group> groups;
}

class Group {
  String name;
  Set<Item> items;
}

这是使用XML使用多对多映射,Group.items作为拥有者,并且想象我有几个类似的类。

我想要的是每个班级,列出拥有角色,以及使用元数据API的反向角色,这可能吗?

到目前为止,我所做的是:

  • 获取I类的PersistentClass正在查看
  • 使用PersistentClass.getPropertyClosureIterator()
  • 获取属性
  • 遍历所有属性,并检查type.isCollectionType()
  • 对于每个集合,我都可以转换为CollectionType并获得当前集合的角色

现在这得到了我所有的角色,但我不知道他们之间的联系。我可以找到联接表等,但不是对方的实际角色。

有关如何获取此信息的任何建议?

1 个答案:

答案 0 :(得分:0)

不是很优雅,但发现这个解决方案在我的情况下工作得很好。

protected void updateJoinTables()
{
    if ( !roleToRole.isEmpty() )
    {
        return;
    }

    Map<String, List<String>> joinTableToRoles = new HashMap<>();

    LocalSessionFactoryBean sessionFactoryBean = getLocalSessionFactoryBean();
    SessionFactoryImplementor sessionFactoryImplementor = (SessionFactoryImplementor) sessionFactory;
    Iterator iterator = sessionFactoryBean.getConfiguration().getCollectionMappings();

    while ( iterator.hasNext() )
    {
        Collection collection = (Collection) iterator.next();
        CollectionPersister persister = sessionFactoryImplementor.getCollectionPersister( collection.getRole() );

        if ( persister.isManyToMany() && collection.getType().isAssociationType() )
        {
            AssociationType associationType = (AssociationType) collection.getType();
            Joinable associatedJoinable = associationType.getAssociatedJoinable( sessionFactoryImplementor );

            if ( !joinTableToRoles.containsKey( associatedJoinable.getTableName() ) )
            {
                joinTableToRoles.put( associatedJoinable.getTableName(), new ArrayList<String>() );
            }

            joinTableToRoles.get( associatedJoinable.getTableName() ).add( collection.getRole() );
        }
    }

    Iterator<Map.Entry<String, List<String>>> entryIterator = joinTableToRoles.entrySet().iterator();

    while ( entryIterator.hasNext() )
    {
        Map.Entry<String, List<String>> entry = entryIterator.next();

        if ( entry.getValue().size() < 2 )
        {
            entryIterator.remove();
        }
    }

    for ( Map.Entry<String, List<String>> entry : joinTableToRoles.entrySet() )
    {
        roleToRole.put( entry.getValue().get( 0 ), entry.getValue().get( 1 ) );
        roleToRole.put( entry.getValue().get( 1 ), entry.getValue().get( 0 ) );
    }
}