@1-1

사용 가능

5.1 다양한 형태의 일대일 커뮤니케이션

두 Entity 클래스 간의 관계에 대한 또 다른 흥미롭고 다소 구체적인 사례인 일대일 관계가 있습니다.

나는 이 경우를 데이터베이스보다 Java 객체에 관한 것이기 때문에 매우 구체적이라고 부릅니다. 데이터베이스에는 테이블 간의 관계에 대한 두 가지 옵션만 있습니다.

  • 테이블 행에는 다른 테이블의 ID에 대한 링크가 포함되어 있습니다.
  • 서비스 테이블은 다대다 관계에 사용됩니다.

Entity 클래스의 경우 여러 주석으로 설명되는 옵션이 있을 수 있습니다.

  • @임베디드
  • 일방적 일대일
  • 양자 일대일
  • @MapsId

아래에서 가장 인기있는 것을 고려할 것입니다.

5.2 임베디드

그건 그렇고, 우리는 이미 가장 간단한 일대일@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;
}

나머지는 Hibernate가 처리합니다. 데이터는 하나의 테이블에 저장되지만 HQL 쿼리를 작성할 때 클래스 필드에서 작업해야 합니다.

HQL 쿼리 예:

select from User where address.city = 'Paris'

5.3 일방적 일대일

이제 상황을 상상해 보십시오. 소스 테이블 직원과 직원을 참조하는 작업이 있습니다. 그러나 우리는 한 명의 사용자에게 최대 한 개의 작업을 할당할 수 있음을 확실히 알고 있습니다. 그런 다음 주석을 사용하여 이 상황을 설명할 수 있습니다 @OneToOne.

예:

@Entity
@Table(name="task")
class EmployeeTask {
   @Column(name="id")
   public Integer id;

   @Column(name="name")
   public String description;

   @OneToOne
   @JoinColumn(name = "employee_id")
   public Employee employee;

   @Column(name="deadline")
   public Date deadline;
}

Hibernate는 하나의 작업이 하나의 사용자를 가질 뿐만 아니라 한 사용자가 하나의 작업만 갖도록 할 것입니다. 그렇지 않으면 이 경우는 @ManyToOne.

5.4 양자 일대일

이전 옵션은 직원을 작업에 할당할 뿐만 아니라 직원에게 작업을 할당하려는 경우가 많기 때문에 약간 불편할 수 있습니다.

이를 위해 EmployeeTask 필드를 Employee 클래스에 추가하고 올바른 주석을 제공할 수 있습니다.

@Entity
@Table(name="employee")
class Employee {
   @Column(name="id")
   public Integer id;

   @OneToOne(cascade = CascadeType.ALL, mappedBy="employee")
   private EmployeeTask task;
}

중요한!직원 테이블에는 task_id 필드가 없으며 대신 테이블 간의 관계를 설정하는 데 작업 테이블 의 employee_id 필드가 사용됩니다 .

개체 간의 연결 설정은 다음과 같습니다.

Employee director = session.find(Employee.class, 4);
EmployeeTask task = session.find(EmployeeTask.class, 101);
task.employee = director;
director.task = task;

session.update(task);
session.flush();

링크를 제거하려면 두 개체에서 링크도 제거해야 합니다.

Employee director = session.find(Employee.class, 4);
EmployeeTask task = director.task;

task.employee = null;
session.update(task);

director.task = null;
session.update(director);

session.flush();
코멘트
  • 인기
  • 신규
  • 이전
코멘트를 남기려면 로그인 해야 합니다
이 페이지에는 아직 코멘트가 없습니다