jpa
Основное картографирование
Поиск…
параметры
| аннотирование | подробности |
|---|---|
@Id | Пометяет поле / столбец как ключ объекта |
@Basic | Помечает поле для сопоставления как базового типа. Это применимо к примитивным типам и их оберткам, String , Date и Calendar . Аннотации фактически необязательны, если параметры не заданы, но хороший стиль будет диктовать ваши намерения в явном виде. |
@Transient | Поля, отмеченные как переходные, не рассматриваются для сохранения, как и transient ключевое слово для сериализации. |
замечания
Всегда должен быть конструктор по умолчанию, то есть без параметров. В базовом примере не было указателя конструктора, поэтому Java добавил один; но если вы добавите конструктор с аргументами, обязательно добавьте конструктор без параметров.
Очень простой объект
@Entity
class Note {
@Id
Integer id;
@Basic
String note;
@Basic
int count;
}
Getters, сеттеры и т. Д. Опущены для краткости, но в любом случае они не нужны для JPA.
Этот Java-класс будет отображаться в следующей таблице (в зависимости от вашей базы данных, приведенной в одном возможном сопоставлении Postgres):
CREATE TABLE Note (
id integer NOT NULL,
note text,
count integer NOT NULL
)
Поставщики JPA могут использоваться для генерации DDL и, скорее всего, производят DDL, отличный от показанного здесь, но пока типы совместимы, это не вызовет проблем во время выполнения. Лучше не полагаться на автоматическое генерирование DDL.
Опускание поля из отображения
@Entity
class Note {
@Id
Integer id;
@Basic
String note;
@Transient
String parsedNote;
String readParsedNote() {
if (parsedNote == null) { /* initialize from note */ }
return parsedNote;
}
}
Если вашему классу нужны поля, которые не должны быть записаны в базу данных, отметьте их как @Transient . После чтения из базы данных поле будет равно null .
Время и дата сопоставления
Время и дата встречаются на разных языках Java: теперь историческая Date и Calendar , а также более поздние LocalDate и LocalDateTime . Timestamp , Instant , ZonedLocalDateTime и типы времени Joda. На стороне базы данных у нас есть time , date и timestamp (время и дата), возможно с часовым поясом или без него.
Дата и время до Java 8
Сопоставление по умолчанию для типов pre-Java-8 java.util.Date , java.util.Calendar и java.sql.Timestamp - это timestamp в SQL; для java.sql.Date это date .
@Entity
class Times {
@Id
private Integer id;
@Basic
private Timestamp timestamp;
@Basic
private java.sql.Date sqldate;
@Basic
private java.util.Date utildate;
@Basic
private Calendar calendar;
}
Это будет идеально соответствовать следующей таблице:
CREATE TABLE times (
id integer not null,
timestamp timestamp,
sqldate date,
utildate timestamp,
calendar timestamp
)
Возможно, это не намерение. Например, часто Java Date или Calendar используется для представления только даты (для даты рождения). Чтобы изменить отображение по умолчанию или просто сделать отображение явным, вы можете использовать аннотацию @Temporal .
@Entity
class Times {
@Id
private Integer id;
@Temporal(TemporalType.TIME)
private Date date;
@Temporal(TemporalType.DATE)
private Calendar calendar;
}
Эквивалентная таблица SQL:
CREATE TABLE times (
id integer not null,
date time,
calendar date
)
Примечание 1: Тип, заданный с помощью @Temporal влияет на генерацию DDL; но вы также можете иметь тип карты date типа Date только с аннотацией @Basic .
Примечание 2: Calendar не может сохраняться только time .
Дата и время с Java 8
JPA 2.1 не определяет поддержку типов java.time предоставляемых на Java 8. Большинство реализаций JPA 2.1 предлагают поддержку для этих типов, хотя это, строго говоря, расширения поставщиков.
Для DataNucleus эти типы просто работают из коробки и предлагают широкий диапазон возможностей отображения, связанных с аннотацией @Temporal .
Для Hibernate, если использовать Hibernate 5.2+, они должны работать из коробки, просто используя аннотацию @Basic . Если вы используете Hibernate 5.0-5.1, вам нужно добавить зависимость org.hibernate:hibernate-java8 . Представленные отображения
-
LocalDateнаdate -
Instant,LocalDateTimeиZonedDateTimeдляtimestamp
Альтернативой, альтернативной поставщикам, также будет определение JPA 2.1 AttributeConverter для любого типа Java Java java.time который должен быть сохранен.
Объект с управляемым идентификатором Id
Здесь у нас есть класс и мы хотим, чтобы в поле идентификатора ( userUid ) было создано его значение через SEQUENCE в базе данных. Предполагается, что эта SEQUENCE называется USER_UID_SEQ и может быть создана администратором баз данных или может быть создана поставщиком JPA.
@Entity
@Table(name="USER")
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@SequenceGenerator(name="USER_UID_GENERATOR", sequenceName="USER_UID_SEQ")
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="USER_UID_GENERATOR")
private Long userUid;
@Basic
private String userName;
}