2009-06-23 7 views
9

tengo una jerarquía de clases:¿Cuál es el mapeo de la APP adecuado para @Id en los padres y secuencial único de clases base

abstract DomainObject { 
... 
    @Id 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator="SEQ") 
    @SequenceGenerator(name="SEQ",sequenceName="SEQ_DB_NAME") 
    @Column(name = "id", updatable = false, nullable = false) 
    private Long id; 
... 
} 

BaseClass extends DomainObject { 
... 
    // Fill in blank here where this class's @Id will use a unique sequence generator 
    // bonus points for any sort of automatic assignment of generator names that might 
    //prevent me from having to instrument all my domain objects uniquely 
... 
} 

notas:

  • No necesito específicamente un generador de clase base , entonces si me corresponde quitarlo no hay problema.
  • Esta es una db Oracle 9i si eso es aplicable
  • Hibernate 3.4 APP
  • Primavera 2.5 está disponible, así

Gracias

Respuesta

8

Bueno aquí es como acabé la solución del problema:

Clase base:

@MappedSuperclass 
public abstract class DomainObject implements Serializable { 
@Id 
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator="SEQ") 
@Column(name = "id", updatable = false, nullable = false) 
private Long id; 

.. rest of class 
} 

clase descendiente:

@Entity 
@SequenceGenerator(name="SEQ",sequenceName="SEQ_DB_NAME") 
public class BusinessObject extends DomainObject { 

... 

} 
+1

Creo que esto solo funcionaría para su primera extensión de DomainObject dentro de la misma unidad de persistencia. En el siguiente, donde tiene que configurar el nombre de SequenceGenerator para que también sea "SEQ", fallaría. Al menos eso es lo que hizo el mío usando el proveedor EclipseLink JPA, y de acuerdo con javadoc http://download.oracle.com/javaee/5/api/javax/persistence/SequenceGenerator.html el nombre debe ser único. – digitaljoel

+1

para cualquier otra persona que esté mirando este hilo ... este comentario es el caso de OpenJPA 2.2. No puede sobrecargar el nombre de SequenceGenerator. – DAJ

0

le recomiendo que utilice el tipo de herencia acumulados a clase base Esto coloca todos los campos comunes en la tabla base y las personalizaciones en tablas específicas. Aquí está la anotación para que:

@Inheritance(strategy=InheritanceType.JOINED) 

Una vez hecho esto, se puede utilizar casi cualquier opción de secuenciación como todas sus identificaciones están siempre en la misma mesa. Puede usar una secuencia separada si lo desea, pero no es compatible con todos los proveedores de bases de datos. Supongo que eso no es un problema ya que estás usando Oracle específicamente.

Lo he usado y parece funcionar bien.

@Id 
@GeneratedValue(strategy=GenerationType.IDENTITY) 
private Long id; 
+0

Es un poco difícil saber lo que era la intención de Nathan del ejemplo, pero encontré esta pregunta porque estoy migrando de las asignaciones de Hibernate a las anotaciones de JPA y a todas mis aplicaciones. Las normas extienden una clase base, por lo que no tengo que definir un campo de identificación, getter/setter, equals(), hashCode(), etc. para cada clase que deseo conservar. En mi caso, estoy usando la herencia para reducir el código repetitivo, pero en realidad no hay ninguna herencia desde una perspectiva de datos. En ese caso, @MappedSuperclass realmente sería la solución preferida. – spaaarky21

Cuestiones relacionadas