Проблема со столбцом идентификатора и JPA - PullRequest
4 голосов
/ 16 мая 2011

Я пробую JPA с очень простым классом для Play!Framework и у меня возникли некоторые проблемы со столбцом id.

В моей базе данных sql есть только два столбца:

CREATE TABLE IF NOT EXISTS `auto` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
)

И моя модель:

@Entity
@Table(name = "auto")
public class Auto extends Model{

    @Column(insertable = false, updatable = false)
    public int id;

    public String name;

    public Auto(String name){
        this.name = name;
    }
}

Все прекрасно работает без этой части:

    @Column(insertable = false, updatable = false)
    public int id;

Как только я добавлю public int id;, я получу эту ошибку, хотя: A JPA error occurred (Unable to build EntityManagerFactory): Repeated column in mapping for entity: models.Auto column: id (should be mapped with insert="false" update="false")

И вот почему я добавилпримечание к столбцу, но с этим тоже ничего не получится, теперь я получаю:

A javax.persistence.PersistenceException has been caught, org.hibernate.PropertyAccessException: could not set a field value by reflection setter of models.Auto.id

Я тестирую модель следующим образом: new Auto("bmw").save(); save () - этометод из класса модели в playframework.

Кто-нибудь знает, почему у меня такая проблема?Спасибо!

Ответы [ 5 ]

6 голосов
/ 16 мая 2011

Хм, попробуйте полностью без поля id.Похоже, Playframework автоматически создает поле Id при расширении класса Model.См. здесь :

"... Если вы уже использовали JPA, вы знаете, что каждый объект JPA должен предоставлять свойство @Id. Здесь суперкласс Model предоставляет автоматически сгенерированный числовой идентификатор,и в большинстве случаев это достаточно хорошо. ... "

1 голос
/ 19 декабря 2011

Проблема, с которой вы столкнулись, связана с недооценкой того, что вы получаете за «бесплатно» в игровой среде.

И идентификатор (ваш первоначальный вопрос), и получатели и установщики (ваш последующий комментарий)автоматически генерируется для вас.

Поле id происходит от расширяемого вами класса Model, а методы получения и установки автоматически генерируются и используются, когда вы создаете открытое поле в своей модели, а затем ссылаетесь на него.позже как model.field.

Хотя для всех моделей будет предоставлен Id, рекомендуется использовать ваши собственные пользовательские идентификаторы, если они хотят сделать что-то более сложное или значимое.

1 голос
/ 16 мая 2011

Разве столбец не должен быть аннотирован подобным следующему?

@Id
@GeneratedValue(generator="???_seq",strategy=GenerationType.SEQUENCE)
1 голос
/ 16 мая 2011
Модель класса

уже добавляет поле идентификатора типа Long.Это противоречит полю id, которое вы добавляете в определение класса.

Просто удалите поле id из Авто, и оно должно работать.Я не уверен, что определение int (11) в вашей базе данных является правильным, но JPA должен автоматически решить это при необходимости.

0 голосов
/ 21 февраля 2013

Если вам нужно добавить собственное поле идентификатора (например, потому что оно должно быть целым числом, а не длинным), вы можете расширить GenericModel вместо Model.

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