Как JPA определяет тип данных атрибутов - PullRequest
1 голос
/ 28 ноября 2011

Типичная сущность JPA выглядит следующим образом:

@Entity
public class Person {
  @Id
  private int id;
  private String name;
  private int age;
  private Calendar anniversary;
  ...
}

Обратите внимание, что тип данных не аннотирован ни для одного из атрибутов члена.

Я только что прочитал заметку о том, что Hibernate не так удобен для типов данных Scala, и подумал, можно ли нам написать несколько адаптеров. Я знаю, что мы можем написать UserType s для типов Scala и UserCollectionType s для коллекций Scala, чтобы можно было использовать адаптеры.

У меня вопрос: можно ли как-то настроить эти типы данных, чтобы JPA автоматически связывал их с соответствующими типами Scala (например, тип пользователя BigDecimal с атрибутами BigDecimal), без необходимости аннотировать каждый атрибут с помощью @Type * * 1013

1 Ответ

0 голосов
/ 01 декабря 2011

Что вам не хватает, так это то, что JPA (в большинстве реализаций) сопоставляется с реляционной базой данных, поэтому он сопоставляется с типом SQL. Таким образом, если вы смотрите на объект выше, он будет отображаться в сериализованный объект, если вы укажете его, но чаще он будет отображаться в структуре.

Давайте поиграем с вашей сущностью и добавим к ней Аккаунт:

@Entity 
public class Account
{
  @Id
  private int id;
  private String name;
  private String password; //no bad don't do this really
}

@Entity
public class Person {
  @Id
  private int id;
  private String name;
  private int age;
  private Account account; //custom type
  private Calendar anniversary;
  ...
}

Если я выполню запрос JPQL "SELECT p FROM Person p" Я получу ->

  Person@AAAAAAAA //some memory with a member child of Account@BBBBBBBB

В базе данных это будет выглядеть так:

SELECT
  p.*,
  a.*
FROM
  Person p INNER JOIN Account a 
    ON p.account_id = a.id

«Пользовательский тип» просто оказался коллекцией примитивов в другой таблице. Вообще говоря, это то, что вы хотите с JPA. Вы пытаетесь подключиться к СУБД в 99% случаев и не используете javax.sql, потому что вы можете в конечном итоге разочароваться в проверенных исключениях.

По сути: думайте об этом как о базе данных, а не как о своем типе. Это то, что делает JPA. Все диалекты, которые вы видите в Hibernate или Eclipselink и т. Д., Делают именно это. Взять приматы и затем сказать: «Когда вы сказали Long Я имею в виду BigInteger Когда вы сказали String Я думаю VARCHAR(2048). Однако вы можете уточнить эти значения по умолчанию с помощью аннотаций, таких как @Column, так что

...
@Column(name="xyz", length="80")
private String name
...
//maps to
COLUMN xyz VARCHAR(80)

Я бы настоятельно рекомендовал вам взглянуть на диалект для базы данных, которую вы знаете, и прочитать код. Это не так уж плохо. Hibernate имеет фантастическую документацию для начинающих. Если вы не знаете SQL, изучите его как можно скорее, если вы работаете с JPA. Вам это понадобится.

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