2012-07-26 199 views
5

我在Employee类定义如下JPA:覆盖自动生成的ID

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

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

+0

很显然,某些JPA实现(例如DataNucleus JPA)可能提供了一种机制,只有当该字段为空时才允许自动生成,但JPA作为规范并不适用。 – DataNucleus 2012-07-26 12:43:32

回答

1

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

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

+0

:(除手动导入之外的任何其他方式?我不能手动执行,因为有一些预处理。在这种情况下,我必须写入插入代码:( – sidgate 2012-07-26 11:35:11

+0

@sidgate也许你可以禁用自动生成,进行导入,并且重新启用它? – 2012-07-26 12:15:19

+0

这可能是可能的,但它取决于列定义(或如何GenerationType.AUTO实际上在数据库中被materilized)id是简单的禁用/启用可能 – 2012-07-26 12:33:00

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中有任何规则说,两个类不能有相同的表名:)

+0

我的模型类是Roo生成的,修改这些类会很麻烦,而我实现了一个新的生成器,下面解释 – sidgate 2012-08-02 08:06:06

+0

OK。在你的问题中提及这些事情,因为这是可能改变人们答案的重要信息。 – Matt 2012-08-02 12:21:53

0

必须覆盖getEmployeeId()方法,在这种情况下,JPA使用在类的所有字段的getter方法使用注释这种方法 ,你必须在吸气移动其他Annotaions方法