我有表Owner
和Species
,这两个实体都具有自动生成的id Integer列。
我有第三个表Cat
,我希望它能够基于前两个表的id退休,所以我想做一些类似的事情:
Session session = sessionFactory.getCurrentSession();
Cat cat = (Cat) session.get(Cat.class, owner.getId, species.id);
而不是
Cat cat = (Cat) session.get(Cat.class, id);
实体类上需要哪些注释?我猜它会像这个一样
@EmbeddedId
private CatId catId;
@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name="ID", insertable=false, updateable=false)
private Owner owner;
@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name="ID", insertable=false, updateable=false)
private Species species;
@ManyToOne
public Owner getOwner() {
return owner;
}
@ManyToOne
public Species getSpecies() {
return species;
}
查询:
Criteria crit = session.createCriteria(Cat.class);
crit.createAlias("owner", "ownerAlias");
crit.createAlias("species", "speciesAlias");
crit.add(Restrictions.eq("ownerAlias.id", ownerId);
crit.add(Restrictions.eq("speciesAlias.id", speciesId);
return crit.list();
这不是一个确切的答案,但你想要的是一个复合ID,我已经遇到了足够多的困难,在我的用例中,我跳过它们,创建一个合成ID,只在表上添加唯一性约束。
此外,从你发布问题的方式来看,在我看来,每个(主人,物种(元组最多只能有一只猫(例如,主人不能有两只同一物种的猫(。如果这不正确,您将需要一个实际的ID。