我试图动态获取多对多映射的两个角色。我的设置是这样的(简化):
class Item {
String name;
Set<Group> groups;
}
class Group {
String name;
Set<Item> items;
}
这是使用XML使用多对多映射,Group.items作为拥有者,并且想象我有几个类似的类。
我想要的是每个班级,列出拥有角色,以及使用元数据API的反向角色,这可能吗?
到目前为止,我所做的是:
现在这得到了我所有的角色,但我不知道他们之间的联系。我可以找到联接表等,但不是对方的实际角色。
有关如何获取此信息的任何建议?
答案 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 ) );
}
}