Bean のアノテーション

列へのデフォルトのマッピングをオーバーライドするために、Bean ではアノテーションを使用できます。 さらにアノテーションは、対応するデータベース表またはビュー内の生成列に、プロパティーが対応するかどうかを示すこともできます。

プロパティー・レベルのアノテーション

pureQuery では、プロパティー・レベル・アノテーションは、public プロパティーおよび public get() / set() メソッドでのみ認識されます。 private プロパティーまたは protected プロパティーではこのアノテーションを認識しません。

構文図で使用されている規則については、構文図の読み方を参照してください。

@Column
構文図を読む構文図をスキップする
>>-@Column--(--name--=--name_of_column--+-------------------------+-><
                                        '-table--=--name_of_table-'   

プロパティーのマップ先のデータベース・オブジェクト内の SQL 列を指定します。 このアノテーションは、public プロパティーおよび public メソッドでのみ使用できます。 他の場所で使用するとしても、pureQuery はそれを無視します。

次の 2 つの理由のいずれかに該当する場合は、@Column アノテーションを使用できます。

  • SQL 列の名前と、Bean 内のプロパティーの名前が大/小文字を区別しない検索で一致しない。この場合は、アノテーションの name 属性のみを使用します。
    @Column(name="DEPTNO") 
    public String deptNum;
    @Column(name="EMPNO") 
    public String getEmpNum() { 		
        return empNum; 	
    }
  • 表の結合の照会結果に、同じ名前の列が 2 つ以上含まれている。この場合は、アノテーションの name 属性と table 属性の両方を使用します。表の名前と列の名前の組み合わせにも重複がある場合は、@Column アノテーションを使用できません。 そのため、照会時には AS 節を使用する必要があります。

    例えば、アプリケーションの中で次のような簡単な照会を実行するとしましょう。
    	select a.col1, b.col1 from a, b where a.id=b.id;
    照会結果を保持している Bean の対応するプロパティーに対する set() メソッドには、2 つの 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 に少なくとも 1 つの @GeneratedKey アノテーションがある場合、更新操作は成功しません。この制限は、update() メソッド (インライン・プログラミング・スタイルの場合)、および @Update アノテーションのメソッド (アノテーション付きメソッドのプログラミング・スタイルの場合) に適用されます。

Bean レベルのアノテーション

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 命名規則に従っていません。

Employee Bean の以下の定義では com.company.Employee クラスのオブジェクトのユーザーにさらに有意な名前を提供するために、@Column アノテーションを使用しています。

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 {...

フィードバック