수색…


매개 변수

주석 세부
@Id 엔터티의 키로 필드 / 열을 표시합니다.
@Basic 요청한 필드를 기본 유형으로 매핑하도록 표시합니다. 이것은 기본 유형 및 해당 랩퍼의 String , DateCalendar 있습니다. 매개 변수를 지정하지 않으면 주석은 실제로 선택 사항이지만 좋은 스타일은 의도를 명시 적으로 지정하도록 지시합니다.
@Transient Transient로 표시된 필드는 직렬화에 대한 transient 키워드와 마찬가지로 지속성으로 간주되지 않습니다.

비고

항상 매개 변수없는 기본 생성자가 있어야합니다. 기본 예제에서는 생성자가 지정되지 않았으므로 Java는 하나를 추가했습니다. 인수를 사용하여 생성자를 추가하는 경우에도 매개 변수없는 생성자를 추가해야합니다.

매우 간단한 엔티티

@Entity
class Note {
    @Id
    Integer id;
 
    @Basic
    String note;

    @Basic
    int count;
}

Getters, setter 등은 간결성을 위해 생략되었지만 어쨌든 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에서 여러 가지 유형으로 나뉩니다. 현재 역사적인 DateCalendar , 최근 LocalDateLocalDateTime . Timestamp , Instant , ZonedLocalDateTime 및 Joda 시간 유형. 데이터베이스 측면에서 우리는 time , date 및 시간 timestamp (시간과 날짜 모두)을가집니다. 아마도 시간대가 있거나 없을 수도 있습니다.

Java 8 이전 날짜 및 시간

사전 Java-8 유형 java.util.Date , java.util.Calendarjava.sql.Timestamp기본 매핑은 SQL의 timestamp 입니다. java.sql.Datedate 입니다.

@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
)

이것은 의도가 아닐 수도 있습니다. 예를 들어, 종종 자바 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 생성에 영향을 @Temporal . 하지만 당신은 또한 타입의 콜 럼 수 date 에 매핑 Date 단지로 @Basic 주석을.

참고 2 : Calendartime 만 지속시킬 수 없습니다.

Java 8의 날짜와 시간

JPA 2.1은 Java 8에서 제공되는 java.time 유형에 대한 지원을 정의하지 않습니다. 그러나 JPA 2.1 구현의 대부분은 엄격하게 이러한 유형의 지원을 제공합니다.

DataNucleus의 경우, 이러한 유형은 바로 사용할 수 있으며 @Temporal 주석과 결합하여 다양한 매핑 가능성을 제공합니다.

Hibernate의 경우, Hibernate 5.2+를 사용하는 @Basic 어노테이션을 사용하여 즉시 @Basic 있다. Hibernate 5.0-5.1을 사용한다면 org.hibernate:hibernate-java8 의존성을 추가 할 필요가있다. 제공되는 매핑은

  • date LocalDate
  • Instant , LocalDateTimeZonedDateTimetimestamp

벤더 중립적 인 대안은 영속화가 필요한 Java 8 java.time 유형에 대해 JPA 2.1 AttributeConverter 를 정의하는 것입니다.

시퀀스 관리 ID가있는 엔터티

여기에 클래스가 있으며 userUid ( userUid ) 필드에 데이터베이스의 SEQUENCE를 통해 값이 생성되기를 원합니다. 이 SEQUENCE는 USER_UID_SEQ 라고 가정하고 DBA가 작성하거나 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;
}


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow