Каково правильное отображение JPA для @Id в родительской и уникальной последовательности в базовых классах - PullRequest
9 голосов
/ 23 июня 2009

У меня есть иерархия классов:

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

примечания:

  • Мне не нужен генератор базового класса, поэтому, если мне удастся удалить его, нет проблем.
  • Это оракул 9i дБ, если применимо
  • Hibernate 3.4 JPA
  • Весна 2.5 также доступна

Спасибо

Ответы [ 2 ]

8 голосов
/ 24 ноября 2009

Хорошо, вот как я решил проблему:

Базовый класс:

@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 {

 ...

}
0 голосов
/ 23 июня 2009

Я бы рекомендовал вам использовать тип наследования JOINED для базового класса. Это помещает все общие поля в базовую таблицу и настройки в конкретные таблицы. Вот аннотация для этого:

@Inheritance(strategy=InheritanceType.JOINED)

Как только это будет сделано, вы можете в значительной степени использовать любой вариант последовательности, поскольку все ваши идентификаторы всегда находятся в одной таблице. Вы можете использовать отдельную последовательность, если хотите, но она поддерживается не всеми поставщиками баз данных. Я думаю, это не проблема, так как вы используете Oracle специально.

Я использовал это, и, кажется, хорошо работает.

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...