Hibernate -using Table per subclass - 如何将现有的超类对象链接到子类对象

时间:2010-02-04 23:18:41

标签: java hibernate orm subclass

我有一个用户hibernate类,Clerk类和Consumer类。所有这些都映射到数据库中自己的表。用户PK还充当了Clerk和Consumer的PK。

所以现在我的问题是如果用户最初是一名职员,他在Users表和Clerks表中有一条记录。如果该用户想成为消费者,我想将该用户的记录链接到新的消费者记录。因此,即使我将userId传递给使用者的记录,它也会将其视为要保留的新用户,并提供duplicate_key异常。如何告诉Hibernate将相同的用户对象与这个新的Consumer对象链接?

3 个答案:

答案 0 :(得分:0)

不,你不能。您正在尝试实现多重继承。用户不能同时使用不支持多重继承的语言的文员和消费者。如果这是一个有效的场景,那么你应该使用合成而不是继承进行映射,这样你的User类就有了Clerk和Consumer子对象,其中一个或两个都可以为null。

答案 1 :(得分:0)

根据您当前的实现,我认为您必须删除实际的Clerk并在复制了所需的属性后保留新的Consumer(这样就可以了解IMO)不要将Clerk投射到Consumer,反之亦然。如果您使用User的功能键(如您所愿),这应该不是问题。

答案 2 :(得分:0)

根据我的经验,最好的方法是首先考虑对象和类,然后看看hibernate从中产生了什么。

当根据java说明你有多重继承(只对接口有效)和变异类型时,即你的用户首先是职员,后来是消费者。不这样做。

请考虑使用此模型:

用户拥有角色类到(子类)角色的映射。职员和消费者是角色。当您让角色对用户进行反向引用时,用户可以作为委托来提供每个用户拥有的属性和方法。

在代码中,这看起来类似于:     class User {         地图,角色和GT;角色;

<T extends Role> T as(<Class<T>> roleClass>){
    return (T) roles.get(roleClass);
}

应该漂亮,干净,灵活。并且很容易使用hibernate映射到数据库模式。