2009-06-23 5 views
9

j'ai une hiérarchie de classes:Quelle est la cartographie appropriée JPA pour @Id dans l'ordre parent et unique dans les classes de 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 
... 
} 

notes:

  • Je ne ai pas besoin spécifiquement un générateur de classe de base , donc s'il me convient de l'enlever sans problème.
  • C'est un oracle 9i db si cela est applicable
  • Hibernate 3.4 JPA
  • Spring 2.5 est également disponible

Merci

Répondre

8

Ok voici comment j'ai fini par résoudre le problème:

Classe de 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 
} 

classe descendante:

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

... 

} 
+1

Je crois que ceci ne fonctionnerait que pour votre première extension de DomainObject dans la même unité de persistance. Sur le prochain, où vous devez définir le nom de SequenceGenerator pour être également "SEQ" il échouerait. Au moins, c'est ce que le mien a fait en utilisant le fournisseur EclipseLink JPA, et selon le javadoc http://download.oracle.com/javaee/5/api/javax/persistence/SequenceGenerator.html le nom doit être unique. – digitaljoel

+1

pour quelqu'un d'autre regardant ce sujet ... ce commentaire est le cas pour OpenJPA 2.2. Vous ne pouvez pas surcharger le nom SequenceGenerator. – DAJ

0

Je vous recommande d'utiliser le type d'héritage JOINED pour la classe de base. Cela place tous les champs communs dans la table de base et les personnalisations dans des tables spécifiques. Voici l'annotation pour que:

@Inheritance(strategy=InheritanceType.JOINED) 

Une fois cela fait, vous pouvez très bien utiliser une option de séquençage que tous vos identifiants sont toujours sur la même table. Vous pouvez utiliser une séquence distincte si vous le souhaitez, mais elle n'est pas prise en charge dans tous les fournisseurs de bases de données. Je suppose que ce n'est pas un problème puisque vous utilisez Oracle spécifiquement. Je l'ai utilisé et cela semble bien fonctionner.

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

Il est un peu difficile de dire quelle est l'intention de Nathan était à partir de l'exemple, mais j'ai couru à travers cette question, car je migre des mappages Hibernate aux annotations JPA et tous mes ent ities étend une classe de base donc je n'ai pas besoin de définir un champ id, getter/setter, equals(), hashCode(), etc. pour chaque classe que je veux persister. Dans mon cas, j'utilise l'héritage pour réduire le code standard, mais il n'y a pas vraiment d'héritage du point de vue des données. Dans ce cas, @MappedSuperclass serait vraiment la solution préférée. – spaaarky21

Questions connexes