java主键可以包含多列吗_Java开发中同一个对象中多次以同一个对象的主键作为属性的@JoinColumn注解...

Java开发过程中,常常会遇到一个对象中多次用到另一个对象的主键作为属性的情况。比如记录一个人的部门变化情况,需要同时记录变更前后的部门编号。之前有误区,以为在这种情况下的@JoinColumn属性必须是实体类的主键,而实际上这个注解的属性值是当前实体类的外键。举例如下:

首选创建Department实体类

@Entity

@Table(name="department")

public class Department implements Serializable{

private static final long serialVersionUID = 1L;

private int departmentId;

private String departmentName;

@Id

@GenerateValue

@Column(name = "departmentId",nullable = false)

public int getDepartmentId(){

return departmentId;

}

public void setDepartmentId(int departmentId) {

this.departmentId = departmentId;

}

@Column(name = "departmentName",nullable = false)

public int getDepartmentName(){

return departmentName;

}

public void setDepartmentName(String departmentName) {

this.departmentName = departmentName;

}

}

和Employee实体类

@Entity

@Table(name="employee")

public class Employee implements Serializable{

private static final long serialVersionUID = 1L;

private int employeetId;

private String employeeName;

@Id

@GenerateValue

@Column(name = "employeeId",nullable = false)

public int getEmployeeId(){

return employeeId;

}

public void setEmployeeId(int employeeId) {

this.employeeId = employeeId;

}

@Column(name = "employeeName",nullable = false)

public int getEmployeeName(){

return employeeName;

}

public void setEmployeeName(String employeeName) {

this.employeeName = employeeName;

}

}

接下来,创建用户的部门调动情况,实现如下:

@Entity

@Table(name="empDeptChangeInfo")

public class EmpDeptChangeInfo implements Serializable{

private static final long serialVersionUID = 1L;

private int itemId;

private Employee employee;

private Department dept1;

private Department dept2;

@Id

@GenerateValue

@Column(name = "itemId",nullable = false)

public int getItemId(){

return itemId;

}

public void setItemId(int itemId) {

this.itemId = itemId;

}

@ManyToOne(cascade = CascadeType.REFRESH, optional = true)

@JoinColumn(name = "employeeId")

public int getEmployeeId(){

return employeeId;

}

public void setEmployee(Employee employee){

this.employee = employee;

}

@ManyToOne(cascade = CascadeType.REFRESH, optional = true)

@JoinColumn(name = "deptId1")

public getDept1(){

return dept1;

}

public void setDept1(Department dept1){

this.dept1 = dept1;

}

@ManyToOne(cascade = CascadeType.REFRESH, optional = true)

@JoinColumn(name = "deptId2")

public getDept2(){

return dept2;

}

public void setDept2(Department dept2){

this.dept2 = dept2;

}

}

值得注意的是,@JoinColumn后面的属性,并非所关联的表中定义的属性字段名或数据库名,如Dept1和Dept2在数据库表empDeptChangeInfo中对应的字段为deptId1和deptId2,而并不是department表的字段departmentId。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值