Отображение сущности JPA для столбцов соединения - PullRequest
0 голосов
/ 13 июня 2019

У меня есть три таблицы EmployeeDepartment, EmployeeGroup и EmpplyeeDetails Table. Таблица EmployeeDepartment имеет первичный ключ DepartmentId и столбец groupId, а EmployeeGroupTable имеет первичный ключ groupid, который должен быть сгенерирован из последовательности данных GroupIdGenerator. EmployeeDetails имеет два первичных ключа: groupid и employeeid. Groupid должен быть таким же, как и в предыдущей таблице Эти значения во всей таблице следует вставить в одну транзакцию. Можете ли вы помочь мне с правильным сопоставлением сущностей JAP?

Я уже пробовал использовать разные комбинации сгенерированного значения и генератора последовательности, но не смог сохранить данные в таблицу.

  @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 таблицах должен иметь правильные значения, например.

Таблица EmployeeDepartment

DepartmentID   GroupId
   1               1

Таблица EmployeeGroup

 GroupID  
   1

Таблица EmployeeDetail

GroupId       EmployeeId
  1            1
  1            2
  1            3

Фактические результаты ниже

Таблица EmployeeDepartment

DepartmentID   GroupId
   1               0

Таблица EmployeeGroup

 GroupID  
   1

Таблица EmployeeDetail

GroupId       EmployeeId
  2            1
  3            2
  4            3

Ответы [ 2 ]

0 голосов
/ 14 июня 2019
 @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:

public class EmployeeId{

private EmployeeGroup employeeGroup;

private Long employeeId;

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

Однако раньше я не использовал составные ключи таким образом.Если это не работает, тогда измените EmployeeId на внедренный ID:

@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;

}

Если это все еще не работает, пожалуйста, прикрепите фрагмент кода, где вы создаете сущности.

0 голосов
/ 13 июня 2019

Важная аннотация: @MapsId("groupId")

Ваше отображение должно быть примерно таким:

   @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 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 {

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

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