连接列的JPA实体映射 [英] JPA Entity mapping for join columns
问题描述
我有三个表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屋!