我有一个Hibernate,spring和GWT应用程序。我有两个表:员工和用户。
每个用户都是员工,因此我在数据库中拥有一对一的关系(它们由主键连接),因此用户扩展了员工。当我首先插入用户时,事情工作正常,它会自动正确插入父母。但是,问题是当我尝试为现有员工添加用户条目时,它不会使用父ID插入用户记录,而是重新创建员工记录和用户记录。
@javax.persistence.Entity
@javax.persistence.Table(name = "User")
@Inheritance(strategy = InheritanceType.JOINED)
@PrimaryKeyJoinColumn(name="Id")
public class User extends Employee
{ .... }
@Reflectable(assignableClasses = true, superClasses = true)
@javax.persistence.Entity
@javax.persistence.Table(name = "Employee")
@Inheritance(strategy = InheritanceType.JOINED)
@PrimaryKeyJoinColumn(name="Id")
public class Employee
{
@Id
@GeneratedValue
@Column(name="Id")
public Integer getId()
{
return id;
}
}
这是正确的做事方式吗?我怎么能克服这个?
非常感谢。
更新1:
通过添加用户,我的意思是我想创建一个与员工具有相同ID的用户。 基本上应该成为:
Insert into User (Id, username,..) Values (1, "Username", ...)
答案 0 :(得分:2)
我认为现有的映射没有任何意义。
我建议废除继承并在Employee和UserAccount之间映射一对一(或一对多)关系。
我认为更好地反映了你的模特。
员工可能或不是系统的用户。在该系统上拥有用户帐户的员工。
如果将来添加更多系统,请使用一对多。员工拥有零个,一个或多个系统的用户帐户。
答案 1 :(得分:0)
第一次阅读您的描述并且您的代码snipet确认时,某些内容不正确。
你提到的一些事情我分为几点:
只是没有意义。
每个用户都是员工,User extends Employee
有意义(有点)
但那你为什么提到一对一的关系呢?这里没有任何关系,也可以通过您的代码显示。
User
是Employee
,但是用户不拥有员工,也没有员工拥有用户属性(这就是“关系”的含义)。
例如,关系是:员工拥有地址,或者用户拥有权限列表。
在最后一点,当您说“为现有员工添加用户条目”时,表明User
在这种情况下应该是{{1}的属性可能是Employee
而不是一对一(因为你想“添加”它)。
虽然如果你退后一步,它也没有多大意义,因为List
在英语意义上不拥有Employee
。
子类/超类通常用于描述更抽象类型的特定类型。例如。 User
是Dog
的子类,因为Dog是特定类型的Animal。我不认为你想要什么。
我认为你需要重新思考你的设计,并且可能描述你想要做的事情。