JPA:覆盖自动生成的ID

时间:2012-07-26 11:06:53

标签: java hibernate jpa

我在Employee类中有以下定义

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "employee_id")
private Integer employeeId;

现在我想用现有员工ID导入现有员工。即使我在保存之前设置了员工ID,也会忽略分配的ID,并存储自动递增的ID。我们如何覆盖这个?

3 个答案:

答案 0 :(得分:1)

你无法覆盖它。首先,JPA没有提供这样做的方法。第二个问题是GenerationType.AUTO可以生成这样一种列类型,它不会通过SQL语句接受用户赋值。

手动导入数据,不要尝试将应用程序本身用作导入工具。

答案 1 :(得分:0)

在这种情况下,最好有一个@MappedSuperclass

@MappedSuperclass
public AbstractEmployee {
   // declare all properties, getters, setters except for the id
}

@Entity
@Table(name="EMPLOYEE")
public class Employee extends AbstractEmployee {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "employee_id")
    private Integer employeeId;

    ...
}

@Entity
@Table(name="EMPLOYEE")
public class EmployeeWithAssignedId extends AbstractEmployee {
    @Id
    @Column(name = "employee_id")
    private Integer employeeId;

    ...
}

因此,当您想手动分配ID时,请使用第二个类。我没有测试过这个,但我相信它应该适用于你的情况。我不相信JPA中有任何规则说两个类不能具有相同的表名:)

答案 2 :(得分:0)

您必须覆盖getEmployeeId()方法并在此方法上使用Annotation 在这种情况下,JPA对类中的所有字段使用getter方法,您必须在getter方法上移动其他Annotaions