Bean의 어노테이션

Bean에서 어노테이션을 사용하여 컬럼에 대한 디폴트 맵핑을 대체할 수 있습니다. 어노테이션은 또한 등록 정보가 해당 데이터베이스 테이블 또는 보기에 생성된 컬럼에 해당하는지 여부를 표시합니다.

등록 정보 레벨 어노테이션

pureQuery는 공용 등록 정보와 공용 get() 또는 set() 메소드에 대해서만 등록 정보 레벨 어노테이션을 인식합니다. 개인용 또는 보호 등록 정보에서는 이 어노테이션을 인식하지 않습니다.

구문 다이어그램에서 사용되는 규칙을 이해하려면 구문 다이어그램 읽는 방법을 참조하십시오.

@Column
구문 도표 읽기시각적 구문 도표 생략
>>-@Column--(--name--=--name_of_column--+-------------------------+-><
                                        '-table--=--name_of_table-'   

등록 정보가 맵핑하는 데이터베이스 오브젝트의 SQL 컬럼을 지정합니다. 공용 등록 정보 및 공용 메소드에서만 이 어노테이션을 사용할 수 있습니다. 다른 위치에 사용하는 경우 pureQuery는 이를 무시합니다.

다음 두 가지 이유 중 하나로 @Column 어노테이션을 사용할 수 있습니다.

  • 대소문자를 구분하지 않은 검색에서는 Bean의 등록 정보 이름과 SQL 컬럼 이름이 일치하지 않습니다. 이 상황에서는 어노테이션의 name 속성만 사용합니다.
    @Column(name="DEPTNO") 
    public String deptNum;
    @Column(name="EMPNO") 
    public String getEmpNum() { 		
        return empNum; 	
    }
  • 테이블 조인의 쿼리 결과에 동일한 이름을 갖는 두 개 이상의 컬럼이 있습니다. 이 상황에서는 어노테이션의 nametable 속성 둘 다를 사용합니다. 테이블 이름 및 컬럼 이름의 조합도 중복되는 경우 @Column 어노테이션을 사용할 수 없습니다. 대신 쿼리에서 AS절을 사용해야 합니다.

    예제

    예를 들어, 응용프로그램이 다음의 단순 쿼리를 실행한다고 합시다.
    	select a.col1, b.col1 from a, b where a.id=b.id;
    Bean에서 쿼리 결과를 보유하는 해당 등록 정보에 대한 set() 메소드에는 두 개의 id 컬럼이 표시되는 테이블의 이름을 제공하는 @Column 어노테이션이 필요합니다.
    public class JoinExample{
    
      private int a_id;
      private int b_id;
    
      @Column (name="id", table="a")
      public void setA_id (int a_id)
      {
        this.a_id = a_id;
      }
      public int getA_id ()
      {
        return a_id;
      }
    
      @Column (name="id", table="b")
      public void setB_id (int b_id)
      {
        this.b_id = b_id;
      }
      public int getB_id ()
      {
        return b_id;
      }
    }
@GeneratedKey
SQL 컬럼이 자동 생성된 컬럼임을 표시합니다. 즉, 값이 INSERT 또는 UPDATE 조작 중에 데이터베이스에 의해 자동으로 지정됩니다.
이 어노테이션을 포함하는 Bean이 어노테이션이 있는 메소드 또는 int update(String sql, Object... parameters)에 정의된 Data 인터페이스 메소드를 사용하는 INSERT 또는 UPDATE 조작에 대한 유일한 매개변수로 제공되는 경우, 제어가 응용프로그램에 리턴되기 전에 어노테이션이 있는 등록 정보가 갱신됩니다.
주의: 둘 이상의 Bean을 입력 매개변수로 갱신 조작에 전달하고 각각의 Bean에 하나 이상의 @GeneratedKey 어노테이션이 있는 경우, 갱신 조작은 성공하지 못합니다. 이러한 제한사항은 update() 메소드(인라인 프로그래밍 양식의 경우) 및 @Update 어노테이션의 메소드(어노테이션이 있는 메소드 프로그래밍 양식의 경우)에 적용됩니다.

Bean 레벨 어노테이션

Bean 레벨 어노테이션은 전체 Bean에 적용됩니다. Bean 레벨 어노테이션을 사용할 때 다음 예와 같이 Bean의 정의를 시작하기 전에 이 어노테이션을 지정해야 합니다.
@ColumnOverride(propertyName="extension", column="PHONE") 
 
public class EmployeeNewCo extends Employee {...

구문 다이어그램에서 사용되는 규칙을 이해하려면 구문 다이어그램 읽는 방법을 참조하십시오.

@ColumnOverride
구문 도표 읽기시각적 구문 도표 생략
>>-@ColumnOverride--(--propertyName--=--"--property--",--column--=--"--name--")-><

SQL 컬럼과 Bean의 등록 정보 간의 연관을 지정합니다. 이 어노테이션은 포함 클래스와 내재적 또는 명시적으로 연관된 테이블 또는 보기의 컬럼 이름과, 이 어노테이션이 맵핑하는 등록 정보의 이름을 포함합니다. 이 어노테이션으로 표시된 맵핑은 이 클래스의 다른 위치 또는 수퍼클래스에 정의된 맵핑을 포함하여 이 등록 정보에 대한 다른 컬럼 맵핑보다 우선합니다.
@ColumnOverrides
구문 도표 읽기시각적 구문 도표 생략
>>-@ColumnOverrides--(------------------------------------------>

      .-,----------------------------------------------------------------------------.      
      V                                                                              |      
>--{----@ColumnOverride--(--propertyName--=--"--property--",--column--=--"--name--")-+--}-->

>--)-----------------------------------------------------------><

@ColumnOverride 어노테이션의 배열을 지정합니다. 두 개 이상의 @ColumnOverride 어노테이션을 지정해야 하는 경우 이 어노테이션을 사용하십시오.

@ColumnOverride 어노테이션의 배열이 @ColumnOverrides 어노테이션의 괄호 안의 중괄호 안에 표시됨을 유의하십시오.

예제

HRDEPT.EMPLOYEE 테이블에 대한 쿼리에 의해 리턴되는 레코드를 보유하도록 Bean을 정의하려는 경우를 가정하십시오.
CREATE TABLE HRDEPT.EMPLOYEE(
  EMPNO CHAR(6) NOT NULL,
  FIRSTNME VARCHAR(12) NOT NULL,
  MIDINIT CHAR(1),
  LASTNAME VARCHAR(15), 
  WORKDEPT CHAR(2), 
  PHONENO CHAR(4),
  HIREDATE DATE,
  PRIMARY KEY(EMPNO))
컬럼 이름 중 일부는 생략되거나 Java™ 이름 지정 규칙을 따르지 않습니다.

직원 Bean에 대한 다음 정의는 @Column 어노테이션을 사용하여 com.company.Employee 클래스의 오브젝트 사용자에게 더 의미있는 이름을 제공합니다.

public class Employee
{
  private String employeeId;
  private String firstName;
  private String middleInitial;
  private String lastName;
  private String departmentId;
  private String extension;
  private Date hireDate;

  @Column(name = "EMPNO")
  public String getEmployeeId ()
  {
    return employeeId;
  }

  public void setEmployeeId (String employeeId)
  {
    this.employeeId = employeeId;
  }

  @Column(name = "FIRSTNME")
  public String getFirstName ()
  {
    return firstName;
  }

  public void setFirstName (String firstName)
  {
    this.firstName = firstName;
  }

  @Column(name = "MIDINIT")
  public String getMiddleInitial ()
  {
    return middleInitial;
  }

  public void setMiddleInitial (String middleInitial)
  {
    this.middleInitial = middleInitial;
  }

  public String getLastName ()
  {
    return lastName;
  }

  public void setLastName (String lastName)
  {
    this.lastName = lastName;
  }

  @Column(name = "WORKDEPT")
  public String getDepartmentId ()
  {
    return departmentId;
  }

  public void setDepartmentId (String departmentId)
  {
    this.departmentId = departmentId;
  }

  @Column(name = "PHONENO")
  public String getExtension ()
  {
    return extension;
  }

  public void setExtension (String extension)
  {
    this.extension = extension;
  }

  public Date getHireDate ()
  {
    return hireDate;
  }

  public void setHireDate (Date hireDate)
  {
    this.hireDate = hireDate;
  }

}

이제, 응용프로그램이 스키마가 약간 다른 데이터베이스에 대해 실행된다고 가정하십시오. 테이블은 다음과 같이 정의됩니다.

CREATE TABLE HRDEPTNEWCO.EMPLOYEE(
  EMPNO CHAR(6) NOT NULL,
  FIRSTNME VARCHAR(12) NOT NULL,
  MIDINIT CHAR(1),
  LASTNAME VARCHAR(15), 
  WORKDEPT CHAR(2), 
  PHONE CHAR(4),
  HIREDATE DATE,
  PRIMARY KEY(EMPNO))

Employee Bean을 서브클래스화하여 새 테이블 정의를 사용하여 작업할 수 있도록 이전 어노테이션을 겹쳐쓸 수 있습니다. 서브클래스의 시작은 다음과 같을 수 있습니다.

@ColumnOverride(propertyName="extension", column="PHONE") 
 
public class EmployeeNewCo extends Employee {...

피드백