Не удается использовать генерацию ключа столбца идентификаторов со стратегией TABLE_PER_CLASS в JPA? - PullRequest
5 голосов
/ 07 января 2012

Этот вопрос связан с проблемой, упомянутой в этой теме .Я также сталкиваюсь с той же проблемой при использовании JPA на MySQL.Я мог решить ее, только когда изменил стратегию генерации на TABLE.

Но вопрос в том, что послужило причиной этой проблемы и почему изменение стратегии на TABLE является решением (это остается без ответа в нить )?

Ответы [ 3 ]

11 голосов
/ 07 января 2012

Чтобы иметь уникальные идентификаторы через иерархию наследования (что требуется JPA), вы, очевидно, не можете сделать это с TABLE_PER_CLASS и IDENTITY, поскольку IDENTITY работает с таблицей, и теперь в иерархии наследования есть несколько «корневых» таблиц.

например, абстрактный базовый класс "Base" и подклассы "Sub1", "Sub2", "Sub3". Таким образом, у вас есть фактические таблицы "SUB1", "SUB2", "SUB3". Так что если вы используете IDENTITY, то это будет означать что-то вроде «автоинкремента» в столбце при использовании MySQL. Следовательно, у SUB1 есть свои идентификаторы, у SUB2 есть свои идентификаторы, а у SUB3 есть свои идентификаторы ... и они независимы, следовательно, могут возникать коллизии в идентификаторе ... поэтому у вас больше нет уникального идентификатора в иерархии наследования.

0 голосов
/ 20 октября 2018

Если вы хотите поделиться некоторым свойством между классами, вы можете использовать @MappedSuperclass для суперкласса, это не повлияет на стратегию генерации Id дочернего класса. просто скопируйте всю аннотацию в дочерний класс

@MappedSuperclass
public class BaseEntity {

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

    @Temporal(TemporalType.TIMESTAMP)
    @Column(columnDefinition = "TIMESTAMP")
    private Date createTime = new Date();


    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }
}
0 голосов
/ 17 ноября 2017

Принятый ответ (хотя и старый) не совсем корректен.Использование GenerationType.IDENTITY не означает, что генерация таблицы используется БД.В javadoc для GenerationType.IDENTITY говорится: «Указывает, что поставщик сохраняемости должен назначить первичные ключи для объекта, используя столбец идентификаторов базы данных.».

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