매핌 열거형
기본 데이터 유형을 매핑하는 방법은 이미 알아냈습니다. @Column 주석 과 @Type 주석을 사용합니다 . 그러나 이러한 주석으로 모든 경우를 다룰 수 있는 것은 아닙니다. 그리고 가장 일반적인 경우는 enum 입니다 .
Java enum 객체는 다음 두 가지 방법으로 데이터베이스에 저장할 수 있습니다.
- 숫자로
- 문자열로
enum을 사용하여 설정되는 사용자가 선호하는 색상을 갖는 간단한 예를 작성해 보겠습니다.
enum Color {
RED,
ORANGE,
YELLOW,
GREEN,
BLUE,
VIOLET
}
User 클래스 에 색상 필드를 추가합니다 .
@Entity
@Table(name="user")
class User
{
@Column(name="id")
public Integer id;
@Column(name="favorite_color")
public Color favoriteColor;
@Column(name="created_date")
public Date createdDate;
}
Hibernate가 Color 유형을 기본에 숫자로 저장하도록 하려면 필드가 필요합니다.좋아하는 색주석 추가:
@Enumerated(EnumType.ORDINAL)
값을 문자열로 저장하려면 주석을 추가해야 합니다.
@Enumerated(EnumType.STRING)
예:
@Entity
@Table(name="user")
class User
{
@Column(name="id")
public Integer id;
@Enumerated(EnumType.ORDINAL) //value will be saved to the base as a number
@Column(name="favorite_color")
public Color favoriteColor;
@Column(name="created_date")
public Date createdDate;
}
매핌 부울
두 번째 유용한 시나리오는 부울 유형 매핑입니다. 역사적으로 SQL에는 Boolean에 대한 고유한 데이터 유형이 없고 대신 거기에서 사용되는 것이 발생했습니다.
가장 일반적인 세 가지 옵션은 다음과 같습니다.
- 1 또는 0
- '에프' 또는 '티'
- 'Y' 또는 'N'
일반적으로 베이스를 디자인할 예정이라면 바로 BIT 타입을 작성하는 것이 좋습니다. 음, 전체 매핑은 다음과 같습니다.
@Column(name = "is_correct", columnDefinition = "BIT")
@Type(type = "org.hibernate.type.NumericBooleanType")
private Boolean isCorrect;
글쎄요, 데이터베이스를 설계하고 있지 않다면 위의 표를 보고 필요한 유형을 올바르게 매핑하는 방법에 대해 생각해 보십시오.
계산된 필드
때때로 엔티티 클래스의 필드 수와 테이블의 열 수가 일치하지 않습니다. 이에 대한 몇 가지 이유가 있을 수 있습니다.
가장 일반적인 경우는 데이터베이스에 저장하고 싶지 않은 Entity 클래스의 일부 필드가 있을 때입니다 . 이것으로 모든 것이 명확합니다 - 그러한 필드에 @Transient 주석을 추가하면 Hibernate는 데이터베이스로 작업할 때 그것을 무시할 것입니다.
예:
@Entity(name = "Square")
public class Square {
@Id
public Long id;
public Integer width;
public Integer height;
@Transient
public Integer total;
}
이는 좋은 옵션이지만 데이터베이스에서 개체를 읽을 때 합계 필드가 null이 됩니다. 그리고 너비*높이의 곱을 포함하고 싶습니다. 이것은 Hibernate에서도 행해질 수 있다. 이에 대한 특별한 @Formula 주석이 있습니다 .
@Entity(name = "Square")
public class Square {
@Id
public Long id;
public Integer width;
public Integer height;
@Formula(value = " width * height ")
public Integer total;
}
이러한 필드는 데이터베이스에 저장되지 않으며 데이터베이스에서 개체를 읽을 때 수식으로 계산된 값이 여기에 기록됩니다.
SQL 쿼리는 다음과 같습니다.
SELECT id, width, height, (width* height) AS total FROM Square;
@임베디드
또 다른 유용한 주석은 @Embedded 입니다 . 하위 개체의 필드를 Entity 클래스 자체의 필드로 간주할 수 있습니다.
User 클래스가 있고 여기에 주소를 추가하기로 결정했다고 가정해 보겠습니다 .
@Entity
@Table(name="user")
class User
{
@Column(name="id")
public Integer id;
@Column(name="user_address_country")
public String country;
@Column(name="user_address_city")
public String city;
@Column(name="user_address_street")
public String street;
@Column(name="user_address_home")
public String home;
@Column(name="created_date")
public Date createdDate;
}
모든 것이 괜찮은 것 같지만 Java의 관점에서 볼 때 주소를 별도의 클래스에 넣는 것이 논리적입니다. 주소는 여전히 별도의 엔터티입니다. 그러나이 모든 정보가 사용자 테이블의 데이터베이스에 저장되어 있다면 어떻게합니까?
@Embedded 주석이 도움이 될 것입니다 . 먼저 UserAddress 클래스를 만들고 사용자 주소에 대한 모든 정보를 여기에 넣습니다.
@Embeddable
class UserAddress
{
@Column(name="user_address_country")
public String country;
@Column(name="user_address_city")
public String city;
@Column(name="user_address_street")
public String street;
@Column(name="user_address_home")
public String home;
}
그런 다음 User 클래스 에서 이 클래스의 필드를 사용합니다 .
@Entity
@Table(name="user")
class User
{
@Column(name="id")
public Integer id;
@Embedded
public UserAddress address;
@Column(name="created_date")
public Date createdDate;
}
@Embedded 주석 덕분에 객체를 저장할 때 Hibernate는 UserAddress 클래스의 필드가 User 클래스 자체 의 필드로 취급되어야 함을 이해할 것입니다 .
중요한! 두 개의 UserAddress 필드를 User 클래스에 추가하기로 결정한 경우 @Embedded를 사용하면 더 이상 작동하지 않습니다. 중복 필드가 생기고 어떻게든 구분해야 합니다. @AttributeOverrides 주석을 사용하여 주석을 재정의하면 됩니다 .
나는 당신이 이것을 알기를 원하지만 여기서는 자세히 다루지 않을 것입니다. 나는 이것이 당신이 머리를 부러 뜨리기에 충분하다고 생각합니다. 궁금하신 분들을 위해 공식 문서 에 대한 링크를 남길 수 있습니다 .
GO TO FULL VERSION