Hibernate ManyToMany

时间:2013-08-08 05:59:08

标签: hibernate

上下文: 我有两个表Secret_Agent和Secret_Mission。两者都有@ManyToMany的关系,因为可以给予许多秘密特工执行相同的秘密任务,并且可以给同一个秘密特工执行许多秘密任务。

Table SECRET_AGENT

Columns SecretAgentId, SecrentAgentName

Table SECRET_MISSION

Columns SecretMissionId, SecrentMissionName

JOIN Table

SECRET_AGENT_MISSION

Columns: SecretAgentId,SecretMissionId

Java代码:

class Secret_Agent {
.
.
.

@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "SECRET_AGENT_MISSION", joinColumns = { @JoinColumn(name = "SecretAgentId") }, inverseJoinColumns = { @JoinColumn(name = "SecretMissionId") }
private List <Secret_Mission> missions;
.
.
.
}

class Secret_Mission {
.
.
.

@ManyToMany(mappedBy = "missions")
private List <Secret_Agent> agents;
.
.
.
}

问题: 我试图在下面提到的代码中获取所有没有通过Hibernate Criteria分配秘密任务的秘密代理:

Criteria criteria = session.createCriteria(Secret_Agent.class);

criteria.add(Restrictions.isNull("missions"));

但是,它不起作用。我同时试着与Projections和QBE一起运气。

另一种方法是使用Crieteria Association,但协会只适用于@OneToMany@ManyToOne

请在这里帮助我。

1 个答案:

答案 0 :(得分:1)

我假设你的映射是正确的:使用Restrictions.isEmpty("missions") - Constrain a collection valued property to be empty(来自javadoc)

PS:在Hibernate中,最好的方法是将映射中的init集合作为:

@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "SECRET_AGENT_MISSION", joinColumns = { @JoinColumn(name = "SecretAgentId") }, inverseJoinColumns = { @JoinColumn(name = "SecretMissionId") }
private List <Secret_Mission> missions = new ArrayList<Secret_Mission>();

并对Secret_Agent.agents

执行相同的操作