2012-07-26 18 views
5

He siguiente definición de clase EmployeeJPA: Invalidar ID generado automáticamente

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

Ahora quiero importar trabajadores de la empresa con los ID de los empleados existentes. Incluso si configuro la ID del empleado antes de guardarla, la ID asignada se ignora y se almacena la ID autoincrementada. ¿Cómo anulamos esto?

+0

Obviamente, algunas implementaciones de JPA (por ejemplo, DataNucleus JPA) pueden proporcionar un mecanismo para permitir la autogeneración solo cuando ese campo es nulo, pero JPA como una especificación no lo hace. – DataNucleus

Respuesta

1

No puede anularlo. En primer lugar, JPA no proporciona la forma de hacerlo. El segundo problema es que GenerationType.AUTO puede producir un tipo de columna que no acepte el valor asignado por el usuario a través de la instrucción SQL.

Realice la importación de datos manualmente y no intente utilizar la aplicación como una herramienta de importación.

+0

:(Cualquier otra forma que no sea la importación manual, no puedo hacerlo manualmente ya que también hay algo de preprocesamiento. En ese caso, tengo que escribir el código de inserción :( – sidgate

+0

@sidgate Tal vez podría deshabilitar el autogenerado, importarlo y ¿volver a habilitarlo? –

+0

Eso puede ser posible, pero depende de la definición de la columna (o cómo GenerationType.AUTO está realmente matizado en la base de datos) de id es simple de deshabilitación/habilitación. –

0

En este caso, podría ser mejor tener un @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; 

    ... 
} 

Así que cuando se desea asignar el ID manualmente, utilizar la segunda clase. No lo he probado, pero creo que debería funcionar para su situación. No creo que haya ninguna regla en JPA que diga que dos clases no pueden tener el mismo nombre de tabla :)

+0

Mis clases de modelo se generaron a partir de Roo. Modificar estas clases habría sido engorroso. En su lugar, implementé un generador nuevo, que se explica a continuación – sidgate

+0

. mencione estas cosas en sus preguntas, ya que esa es información importante que podría alterar las respuestas de las personas. – Matt

0

debe reemplazar el método getEmployeeId() y el uso de este método de anotación en en este caso APP utiliza los métodos de acceso para todos los campos de la clase y tiene que mover a otros Annotaions el captador métodos

Cuestiones relacionadas