Разница между аннотирующими полями и методами в JPA (Hibernate)? - PullRequest
1 голос
/ 22 июля 2010

Есть ли в спецификации JPA или официальных документах какие-либо заявления о некоторых реализациях JPA, которые описывают поведение, когда мы аннотируем методы сущности и когда мы аннотируем поля сущности?

Всего несколько часов назад я столкнулся с ужасной проблемой:Я использую JPA (через Hibernate, но без каких-либо специфичных для Hybernate в Java-коде) с MS SQL Server.И я разместил все аннотации на полях сущностей (я предпочитал этот стиль до сегодняшнего дня).

Когда я посмотрел на БД, я обнаружил, что все столбцы таблицы, которые должны быть первичными ключами и которые должны содержать некоторые целые числа (идентификаторы), на самом деле имели тип varbinary(255, null) и содержали хэши чего-либо (я не знаючто это было, но это выглядело как типичный хеш MD5).

Самое разочарованное в том, что приложение работало правильно.Но иногда (при обновлении) я получал исключение MS SQL, в котором говорилось, что я пытался вставить слишком длинные значения и данные не могут быть усечены.

В конечном итоге (в качестве эксперимента) я удалил все аннотации из полей сущностей и поместил всеих на методы.Я воссоздал БД, и все таблицы содержали идеальный столбец FK.И в этих столбцах хранятся целые числа (идентификаторы, например, 1, 3, 4 ...).

Итак, кто-нибудь может объяснить, что это было?

Я нашел этот SO поток и принятый ответ говорит, что предпочтительным способом является размещение аннотаций на полях.По крайней мере, для моего конкретного случая я могу сказать, что это не так.

Ответы [ 2 ]

0 голосов
/ 12 марта 2013

JPA допускает два типа доступа к данным постоянного класса.Доступ к полю, который означает, что он сопоставляет переменные (поля) экземпляра со столбцами в базе данных, и доступ к Свойству, что означает, что он использует получатели для определения имен свойств, которые будут отображены в БД.Какой тип доступа будет использоваться, зависит от того, где вы поместили аннотацию @Id (в поле id или метод getId ()).

0 голосов
/ 03 ноября 2011

Исходя из опыта, я делаю следующее.

  1. Я помещаю детали сущности вверху определения класса сущности (например, схему, ограничения строк и т. Д.) ....

    @Entity
    @Table(name="MY_TABLE", schema = "MY_SCHEMA", uniqueConstraints = @UniqueConstraint(columnNames = "CONSTRAINT1"))
    
  2. Для определенных полей я не ставлю аннотации на объявления полей, а скорее на методы получения для этих полей

    @Column(name = "MY_COL", table="MY_TABLE", nullable = false, length = 35)
    public String getMyCol() {
        return this.myCol;
    }
    
    public void setMyCol(String myCol) {
        this.myCol = myCol;
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...