Hibernate继承在父级之后插入子级

时间:2012-07-13 19:25:02

标签: java hibernate hibernate-mapping

我有一个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", ...)

2 个答案:

答案 0 :(得分:2)

我认为现有的映射没有任何意义。

我建议废除继承并在Employee和UserAccount之间映射一对一(或一对多)关系。

我认为更好地反映了你的模特。

员工可能或不是系统的用户。在该系统上拥有用户帐户的员工。

如果将来添加更多系统,请使用一对多。员工拥有零个,一个或多个系统的用户帐户。

答案 1 :(得分:0)

第一次阅读您的描述并且您的代码snipet确认时,某些内容不正确。

你提到的一些事情我分为几点:

  • 每个用户都是员工
  • 我有OneToOne关系
  • 用户扩展员工
  • 当我尝试为现有员工添加用户条目时

只是没有意义。

每个用户都是员工,User extends Employee有意义(有点) 但那你为什么提到一对一的关系呢?这里没有任何关系,也可以通过您的代码显示。

UserEmployee,但是用户不拥有员工,也没有员工拥有用户属性(这就是“关系”的含义)。

例如,关系是:员工拥有地址,或者用户拥有权限列表。

在最后一点,当您说“为现有员工添加用户条目”时,表明User在这种情况下应该是{{1}的属性可能是Employee而不是一对一(因为你想“添加”它)。

虽然如果你退后一步,它也没有多大意义,因为List在英语意义上不拥有Employee

子类/超类通常用于描述更抽象类型的特定类型。例如。 UserDog的子类,因为Dog是特定类型的Animal。我不认为你想要什么。

我认为你需要重新思考你的设计,并且可能描述你想要做的事情。