我在Employee类定义如下JPA:覆盖自动生成的ID
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "employee_id")
private Integer employeeId;
现在我想用现有的员工ID导入现有的员工。即使我在保存之前设置员工ID,分配的ID也会被忽略,并自动递增ID被存储。我们如何覆盖这个?
我在Employee类定义如下JPA:覆盖自动生成的ID
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "employee_id")
private Integer employeeId;
现在我想用现有的员工ID导入现有的员工。即使我在保存之前设置员工ID,分配的ID也会被忽略,并自动递增ID被存储。我们如何覆盖这个?
你不能覆盖它。首先,JPA不提供这种方式。第二个问题是GenerationType.AUTO可以生成这样的列类型,它不会通过SQL语句接受用户分配的值。
手动执行数据导入,不要尝试将应用程序本身用作导入工具。
:(除手动导入之外的任何其他方式?我不能手动执行,因为有一些预处理。在这种情况下,我必须写入插入代码:( – sidgate 2012-07-26 11:35:11
@sidgate也许你可以禁用自动生成,进行导入,并且重新启用它? – 2012-07-26 12:15:19
这可能是可能的,但它取决于列定义(或如何GenerationType.AUTO实际上在数据库中被materilized)id是简单的禁用/启用可能 – 2012-07-26 12:33:00
在这种情况下,它可能是最好有一个@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中有任何规则说,两个类不能有相同的表名:)
必须覆盖getEmployeeId()方法,在这种情况下,JPA使用在类的所有字段的getter方法使用注释这种方法 ,你必须在吸气移动其他Annotaions方法
很显然,某些JPA实现(例如DataNucleus JPA)可能提供了一种机制,只有当该字段为空时才允许自动生成,但JPA作为规范并不适用。 – DataNucleus 2012-07-26 12:43:32