连接列的JPA实体映射 [英] JPA Entity mapping for join columns

查看:88
本文介绍了连接列的JPA实体映射的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有三个表EmployeeDepartment,EmployeeGroup和EmpplyeeDetails表. EmployeeDepartment表具有主键departmentId和一列groupId,EmployeeGroupTable具有主键groupid,应从数据库序列GroupIdGenerator生成该主键. EmployeeDetails有两个主键,分别是groupid和employeeid. Groupid应与上表相同 所有表中的这些值应插入一个事务中. 您可以帮助我进行正确的JAP实体映射吗?

I have three tables EmployeeDepartment, EmployeeGroup and EmpplyeeDetails Table. EmployeeDepartment table has primary key departmentId and a column groupId, EmployeeGroupTable has primary key groupid which should be generated from databse sequence GroupIdGenerator. EmployeeDetails have two primary keys as groupid and employeeid. Groupid should be same as of the previous table These values in all table should insert in one transaction. Can you help me with correct JAP Entity mapping?

我已经尝试过使用生成值和序列生成器的不同组合,但是无法将数据保存到表中.

I already tried with different combination of Generated value and Sequence generator but not able to save the data into table.

  @Entity
   @Table(name="EMPLOYEE_DEPARTMENT")
   public class EmployeeDepartment {

   @Column(name = "DEPARTMENT_ID")
   @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = 
      "departmentid-gen")
   @Id
   @NotNull
   @SequenceGenerator(name = "departmentid-gen", sequenceName = 
     "DEAPARTMENT_ID_GENERATOR" )
   private  long departmentId;

   @OneToOne(mappedBy = "employeeGroup")
      private EmployeeGroup employeeGroup;
      }
  @Coulmn(name="GROUP_ID") 
  private long groupId;




   @Entity
   @Table(name="EMPLOYEE_GROUP")
   public class EmployeeGroup {

   @Column(name = "GROUP_ID")
   @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = 
      "groupid-gen")
   @Id
   @NotNull
   @SequenceGenerator(name = "groupid-gen", sequenceName = 
     "GROUIP_ID_GENERATOR" )
   private  long groupId;

   @OneToMany(mappedBy = "employeeDetail")
      private List<EmployeeDetail> employeeDetails;

  @OneToOne
  @JoinColumn(name = "DEPARTMENT_ID", insertable=false , 
        updatable=false)
      private EmployeeDepartment employeeDepatment;
      }



@Entity
   @Table(name = "EMPLOYEE_DETAIL")
   @IdClass(EmployeeID.class)
   public class EmployeeDetail {

  @ManyToOne
  @JoinColumn(name = "GROUP_ID", insertable=false , updatable=false)
  private EmployeeGroup employeeGroup;

  @Id
  @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = 
     "groupid-gen")
  @SequenceGenerator(name = "groupid-gen", sequenceName = 
    "GROUIP_ID_GENERATOR" )
  @Column(name = "GROUP_ID")
  @Nonnull
     private Long groupId;

  @Id
  @Nonnull
  @Column(name = "EMPLOYEE_ID")
    private Long employeeId;

}

public class EmployeeId{

private Long groupId;

private Long employeeId;

public EmployeeId(final Long groupId, final Long employeeId) {
    this.groupId = groupId;
    this.employeeId = employeeId;
}

public EmployeeId() {
}

}

这3个表中的预期结果应具有适当的值.

Expected result in these 3 tables should have proper values like.

表EmployeeDepartment

Table EmployeeDepartment

DepartmentID   GroupId
   1               1

表EmployeeGroup

Table EmployeeGroup

 GroupID  
   1

表EmployeeDetail

Table EmployeeDetail

GroupId       EmployeeId
  1            1
  1            2
  1            3

实际结果如下

表EmployeeDepartment

Table EmployeeDepartment

DepartmentID   GroupId
   1               0

表EmployeeGroup

Table EmployeeGroup

 GroupID  
   1

表EmployeeDetail

Table EmployeeDetail

GroupId       EmployeeId
  2            1
  3            2
  4            3

推荐答案

 @Entity
   @Table(name="EMPLOYEE_DEPARTMENT")
   public class EmployeeDepartment {

   @Column(name = "DEPARTMENT_ID")
   @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = 
      "departmentid-gen")
   @Id
   @NotNull
   @SequenceGenerator(name = "departmentid-gen", sequenceName = 
     "DEAPARTMENT_ID_GENERATOR" )
   private  Long departmentId;

   @OneToOne(mappedBy = "employeeGroup")
      private EmployeeGroup employeeGroup;
      }
  @Column(name="GROUP_ID") 
  private EmployeeGroup group;




   @Entity
   @Table(name="EMPLOYEE_GROUP")
   public class EmployeeGroup {

   @Column(name = "GROUP_ID")
   @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = 
      "groupid-gen")
   @Id
   @NotNull
   @SequenceGenerator(name = "groupid-gen", sequenceName = 
     "GROUIP_ID_GENERATOR" )
   private  Long groupId;

   @OneToMany(mappedBy = "employeeDetail")
      private List<EmployeeDetail> employeeDetails;

  @OneToOne
  @JoinColumn(name = "DEPARTMENT_ID", insertable=false , 
        updatable=false)
      private EmployeeDepartment employeeDepatment;
      }



@Entity
   @Table(name = "EMPLOYEE_DETAIL")
   @IdClass(EmployeeID.class)
   public class EmployeeDetail {

  @Id
  @ManyToOne
  @JoinColumn(name = "GROUP_ID", insertable=false , updatable=false)
  private EmployeeGroup employeeGroup;

  @Id
  @Nonnull
  @Column(name = "EMPLOYEE_ID")
    private Long employeeId;

您还需要相应地更改EmployeeId:

You also need to change the EmployeeId accordingly:

public class EmployeeId{

private EmployeeGroup employeeGroup;

private Long employeeId;

public EmployeeId(final EmployeeGroup employeeGroup, final Long employeeId) {
    this.employeeGroup= employeeGroup;
    this.employeeId = employeeId;
}

但是,我以前从未以这种方式使用复合键.如果不起作用,则将EmployeeId更改为EmbeddedId:

However I haven't use composite keys this way before. If it doesn't work, then change EmployeeId to an embeddedId:

@Embeddable
public class EmployeeId implements Serializable{

@ManyToOne(fetch = FetchType.LAZY, optional = false)
private EmployeeGroup employeeGroup;

@Nonnull
@Column(name = "EMPLOYEE_ID")
private Long employeeId;

public EmployeeId(final EmployeeGroup employeeGroup, final Long employeeId) {
    this.employeeGroup= employeeGroup;
    this.employeeId = employeeId;
}


@Entity
@Table(name = "EMPLOYEE_DETAIL")
public class EmployeeDetail {

  @EmbeddedId
  private EmployeeId id;

  @ManyToOne
  @JoinColumn(name = "GROUP_ID", insertable=false , updatable=false)
  private EmployeeGroup employeeGroup;

}

如果仍然无法使用,请在创建实体的地方附加代码段.

If it still doesn't work, then please attach the code snippet where you create the entities.

这篇关于连接列的JPA实体映射的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆