Проблема с Hibernate Inheritance. Подкласс, использующий неправильную последовательность - PullRequest
1 голос
/ 17 марта 2011

Мои отображения приведены ниже.

Вот базовый класс для всех классов.Там нет таблицы для этого класса.Все идентификаторы пользователя подклассов в качестве их PK.

@MappedSuperclass
public abstract class Model {
    private Long id;

    @Id
    @GeneratedValue(strategy=GenerationType.Sequence, generator="myGenerator")
    public Long getId() { return id; }
}

Класс для комментариев, который имеет свою собственную таблицу, со столбцами для всех полей в Model

@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
@Table(name = "COMMENT")
@SequenceGenerator(name="myGenerator", sequenceName="COMMENT_SEQ", allocationSize=1)
public class Comment extends Model {
    //some data
}

Подкласс комментария, который такжеимеет собственную таблицу со столбцами для всех полей в Comment и Model

@Entity
@Table(name = "ORDER_COMMENT")
@SequenceGenerator(name="myGenerator", sequenceName="ORDER_COMMENT_SEQ", allocationSize=1)
public class OrderComment extends Model {
    //some data
}

Этот класс имеет свою собственную таблицу и может иметь от одного до многих комментариев порядка.

@Entity
@Table(name="ORDER")
@SequenceGenerator(name="myGenerator", sequenceName="ORDER_SEQ", allocationSize=1)
public class Order extends Model {
    private Set<OrderComment> = new HashSet<OrderComment>();

    @OneToMany
    @JoinColumn(name="ORDER_ID")
    public Set<OrderComment> getComments() { return comments; }
}

Проблемав том, что когда я добавляю новый OrderComment в Order, Hibernate выбирает идентификатор из последовательности для Comment вместо последовательности для OrderComment.

Любые идеи о том, почему это происходит, и что я могу изменить, чтобы решить эту проблему?Или есть лучший способ отобразить это?

Ответы [ 2 ]

1 голос
/ 17 марта 2011

SequenceGenerator глобально идентифицируется по имени, поэтому у вас может быть только один, называемый myGenerator.

Если вы хотите использовать свой идентификатор в глобальной переменной с @GeneratedValue, вам нужно определить один @SequenceGenerator и использовать одну последовательность для всех ваших таблиц.

В качестве альтернативы, вы можете оставить абстрактный метод getId в своем суперклассе и внедрить его в каждом подклассе: hibernate счастлив, и у вас будет единый способ достичь своих идентификаторов.

0 голосов
/ 21 мая 2013

Мы используем генератор последовательности здесь, чтобы сделать каждую Модель различимой, поэтому Комментарий - это Модель , OrderComment - это Модель , Заказ Модель тоже. Они должны совместно использовать генератор последовательности из этого представления.

Вы можете определить один генератор последовательности, используемый несколькими объектами, как этот пост .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...