매핌 열거형

기본 데이터 유형을 매핑하는 방법은 이미 알아냈습니다. @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 주석을 사용하여 주석을 재정의하면 됩니다 .

나는 당신이 이것을 알기를 원하지만 여기서는 자세히 다루지 않을 것입니다. 나는 이것이 당신이 머리를 부러 뜨리기에 충분하다고 생각합니다. 궁금하신 분들을 위해 공식 문서 에 대한 링크를 남길 수 있습니다 .