почему тот же идентификатор в @MappedSuperclass, когда @Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)

Я пытаюсь иметь 2 таблицы следующим образом:

MISУпражнение (таблица)


ИДЕНТИФИКАЦИОННОЕ ИМЯ...

2 a


MISInteractiveExercise(таблица)


ИДЕНТИФИКАЦИОННОЕ ИМЯ...

1 b


У них не должно быть одинаковых идентификаторов. И они наследуются от одной и той же базы. Мой код:

@MappedSuperclass  
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public abstract class MISExerciseBase {
    @Id
    @GeneratedValue(strategy = GenerationType.TABLE)
    private Integer id; 

    ...
}

@Entity
public class MISExercise extends MISExerciseBase{
   ...
}

@Entity
public class MISInteractiveExercise extends MISExerciseBase{
   ...
}

К сожалению, я обнаружил, что таблица MISExercise и таблица MISInteractiveExercise могут иметь один и тот же идентификатор. Когда я гуглю, я нахожу http://openjpa.208410.n2.nabble.com/same-Id-on-mapped-superclass-td2435374.html. У @Kaayan, похоже, та же проблема. Но я не могу получить помощь с этой страницы.

И кажется, если я буду использовать @Entity, а не @MappedSuperclass, все будет в порядке. Но почему и как лучше?


person toxin    schedule 19.12.2013    source источник


Ответы (2)


Поскольку оба ваших класса MISExercise и MISInteractiveExersice наследуются от MISExerciseBase, и вы установили свою стратегию генерации как @GeneratedValue(strategy = GenerationType.TABLE), ваши id не будут уникальными для всех ваших таблиц, а будут уникальными только для каждой таблицы.

Если вы хотите иметь уникальный идентификатор для нескольких таблиц, например, в вашем случае MISExercise и MISInteractiveExerice, вам необходимо изменить стратегию генерации на Auto.

Итак, чтобы решить вашу проблему, измените свой абстрактный класс MISExerciseBase на этот...

@MappedSuperclass  
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public abstract class MISExerciseBase {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO) //NOTE This Change to AUTO
    private Integer id; 

    ...
}
person SpartanElite    schedule 19.12.2013
comment
Как stackoverflow.com/questions/3154649/ говорит, что не может использовать AUTO. Но я просто пытаюсь использовать AUTO, вроде нормально. Так что я в замешательстве. - person toxin; 20.12.2013
comment
Если вы хотите иметь уникальные идентификаторы для каждой таблицы, придерживайтесь того, что у вас есть. Но если вам нужны уникальные идентификаторы (т.е. обе таблицы используют один и тот же глобальный генератор последовательностей, используйте AUTO). - person SpartanElite; 20.12.2013
comment
Хорошо, спасибо. Но есть ли разница, когда я использую @Entity вместо @MappedSuperclass? Когда я смотрю в свою базу данных, она также не создает таблицу MISExerciseBase. - person toxin; 21.12.2013
comment
И я все еще не понимаю эту ссылку stackoverflow.com/questions/3154649/. Когда я гуглил, я обнаруживал, что подобный ответ встречался много раз, и все говорят, что при использовании стратегии InheritanceType.TABLE_PER_CLASS вы можете использовать только GenerationType.TABLE. Есть идеи? - person toxin; 21.12.2013
comment
Если вы используете @MappedSuperclass, то таблица базы данных не будет создана. При использовании @Entity он сгенерировал соответствующую таблицу БД. - person SpartanElite; 03.01.2014

Я столкнулся с похожей проблемой. Это исправило это для меня, добавив это как аннотацию уровня класса:

@SequenceGenerator(initialValue = 1, name = "idgen", sequenceName = "parentseq", allocationSize = 1)

Вам не нужно указывать ВСЕ эти вещи, но важной частью является sequenceName и обеспечение того, чтобы дочерние классы использовали тот же класс, что и родительский.

person Forrest    schedule 05.04.2019