Java 父类中@Id和基类中唯一序列的正确JPA映射是什么

Java 父类中@Id和基类中唯一序列的正确JPA映射是什么,java,hibernate,jpa,sequences,Java,Hibernate,Jpa,Sequences,我有一个类层次结构: abstract DomainObject { ... @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator="SEQ") @SequenceGenerator(name="SEQ",sequenceName="SEQ_DB_NAME") @Column(name = "id", updatable = false, nullable = false) pr

我有一个类层次结构:

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
...
}
注:

  • 我并不特别需要一个基类生成器,所以如果我需要删除它,也没问题
  • 这是一个oracle 9i db(如果适用)
  • Hibernate3.4JPA
  • Spring2.5也可用

谢谢

我建议您对基类使用联接继承类型。这会将所有公共字段放在基表中,并将自定义设置放在特定表中。以下是对此的注释:

@Inheritance(strategy=InheritanceType.JOINED)
完成后,您几乎可以使用任何排序选项,因为所有ID始终位于同一个表中。如果需要,可以使用单独的序列,但并非所有数据库供应商都支持该序列。我想这不是一个问题,因为您是专门使用Oracle的

我用过这个,看起来效果不错

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

好的,下面是我最终解决问题的方式:

基类:

@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
}
后代类:

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

 ...

}

我相信这只适用于同一持久性单元中的DomainObject的第一个扩展。在下一个例子中,您必须将SequenceGenerator的名称也设置为“SEQ”,它将失败。至少这是我使用EclipseLink JPA提供程序所做的,并且根据javadoc,名称必须是唯一的。对于查看此线程的任何其他人来说……此注释适用于OpenJPA 2.2。您不能重载SequenceGenerator名称。很难从示例中看出Nathan的意图,但我遇到了这个问题,因为我正在从Hibernate映射迁移到JPA注释,并且我的所有实体都扩展了一个基类,所以我不必定义id字段getter/setter、equals()、hashCode(),等等。对于每门课我都想坚持。在我的例子中,我使用继承来减少样板代码,但从数据的角度来看,实际上没有任何继承。在这种情况下,@MappedSuperclass确实是首选解决方案。