Что вам не хватает, так это то, что 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. Вам это понадобится.