NaturalId,它是如何工作的?

时间:2011-07-14 17:35:36

标签: hibernate annotations composite-primary-key

我遇到了本地人的问题,我不知道我做得对。

我有一个名为Aircraft的类,它有一个生成的id。但它的原生id是序列号(Integer)和Model(自定义类),如下所示:

public class Aircraft{

@Id @GeneratedValue(strategy=GenerationType.AUTO,generator="COD_NS_AENV")
@Column(name="COD_NS")
private Integer id;
@Column(name="NUM_IDENT_NS_AENV")
@NaturalId
private Integer serialNumber;
@ManyToOne
@NaturalId
private Model model;

.
.
.
}

我从XML加载此类并保存到数据库中,如下所示:

.
.
.
Aircraft aircraft= (Aircraft)xstream.fromXML(reader);
Session session =  HibernateUtil.openSession();
Transaction t = session.beginTransaction();

session.saveOrUpdate(aircraft.getModelo());
session.saveOrUpdate(aircraft);
t.commit();
session.close();

它适用于插入,但我的问题是当我用相同的信息再次执行此代码时,Hibernate插入另一架飞机。我希望Hibernate只更新当前的注册表。

我重写了方法equals()来测试serialNumber和Model属性,但它永远不会被调用。

我不知道如何让Hibernate明白具有serialNumber和model的对象是NativeId。

提前致谢!

亚历山大

1 个答案:

答案 0 :(得分:0)

很可能Hibernate只使用@Id属性并且每次都会生成新值。发生这种情况是因为你从XML读取你的对象而id不是XML,我假设。我不认为自然id会与代理自动生成的id共存。对于saveOrUpdate,Hibernate只会查看id以确定对象是否是新的。

以下是Hibernate forums的详细信息。