play 1.xフレームワークの構成と使用(四)--JPA慣用注記

7971 ワード

1,@Entity(name="EntityName")は必須、nameはオプション、対応データベースの1つのテーブル2,@Table(name=",catalog=",schema=")はオプション、通常@Entityと組み合わせて使用され、エンティティのclass定義にのみ表示され、エンティティに対応するデータベース#データベース#テーブルを表す情報name:オプション、テーブルの名前を表す.デフォルトでは、テーブル名とエンティティ名が一致するが、一致しない場合にのみテーブル名catalogを指定する必要がある:オプションで、Catalog名を表し、デフォルトはCatalog(")である.schema:オプションで、Schema名を表す.デフォルトはSchema(""").3、@idは@idでデータベーステーブルにマッピングするプライマリ・キーの属性を定義しなければならず、1つのエンティティに1つの属性しかプライマリ・キーにマッピングできない.getXxxx()の前に置く.4,@GeneratedValue(strategy=GenerationType,generator=")オプションstrategy:プライマリ・キー生成ポリシーを表し、AUTO,INDENTITY,SEQUENCE,TABLEの4種類があり、それぞれORMフレームワークを自動的に選択し、データベースのIdentityフィールドに基づいて生成し、データベース・テーブルのSequenceフィールドに基づいて生成し、1つの追加のテーブルに基づいてプライマリ・キーを生成することを表す.デフォルトではAUTOgenerator:プライマリ・キー生成器の名前を表すが、この属性は通常ORMフレームワークに関連する、例えばHibernateはuuidなどのプライマリ・キー生成方式を指定することができる.例:
@Id
    @GeneratedValues(strategy=StrategyType.SEQUENCE)
    public int getPk() {
          return pk;
    }

5,@Basic(fetch=FetchType,optional=true)オプション@Basicはデータベーステーブルへの簡単な属性のフィールドへのマッピングを表し、表記のないgetXxxx()メソッドについては、デフォルトは@Basicfetch:この属性を表す読み出しポリシーであり、EAGERとLAZYの2種類があり、それぞれマスタスナップと遅延ロードを表し、デフォルトはEAGERである.optional:属性がnullに許可されているかどうかを示し、デフォルトはtrueの例です.
@Basic(optional=false)
    public String getAddress() {
          return address;
    }

6,@Columnオプション@Columnは、JPA注記に従ってデータベーステーブル構造を生成するためのツールとして役立つデータベーステーブルのフィールドの詳細な定義を記述する.name:データベーステーブル内のフィールドの名前を表し、デフォルトのプロパティ名が一致nullable:フィールドがnullに許可されているかどうかを表し、デフォルトはtrueunique:フィールドが一意であるかどうかを表し、デフォルトはfalselength:フィールドのサイズを表し、Stringタイプのワードセグメントのみに有効なinsertable:ORMフレームワークで挿入操作を実行する場合、このフィールドにINSETRT文が表示するかどうか、デフォルトはtrueupdateable:ORMフレームワークで更新操作を実行するときにUPDATE文に表示すべきかどうか、デフォルトはtrueである.このプロパティは、birthdayフィールドなど、作成すると変更できないフィールドに便利です.columnDefinition:このフィールドのデータベース内の実際のタイプを表す.通常、ORMフレームワークは、属性タイプによってデータベース内のフィールドのタイプを自動的に判断することができるが、Dateタイプについては、データベース内のフィールドタイプがDATEであるか、TIMEであるか、TIMESTAMPであるかを判断することはできない.また、StringのデフォルトマッピングタイプはVARCHARである、Stringタイプを特定のデータベースのBLOBまたはTEXTフィールドタイプにマッピングする場合に便利である.例:
    @Column(name="BIRTH",nullable="false",columnDefinition="DATE")
    public String getBithday() {
       return birthday;
    }

7,@Transientオプション@Transientは、この属性がデータベーステーブルへのフィールドのマッピングではないことを示し、ORMフレームワークはこの属性を無視する.属性がデータベース・テーブルのフィールド・マッピングでない場合は、必ず@Transientと表示してください.そうでない場合は、ORMフレームワークのデフォルトの注釈は@Basicの例です.
    //    birth     age   
    @Transient
    public int getAge() {
         return getYear(new Date()) - getYear(birth);
    }

8,@ManyToOne(fetch=FetchType,cascade=CascadeType)オプション@ManyToOneは、通常、データベーステーブルの外部キーoptional:このフィールドがnullであることを許可するか否かを示す複数対1のマッピングを表す.この属性は、データベーステーブルの外部キー制約に基づいて決定すべきであり、デフォルトはtruefetch:キャプチャポリシーを表し、デフォルトはFetchTypeである.EAGERcascade:ALL、PERSIST、MERGE、REFRESH、REMOVEのいくつかの組合せとして指定することができるデフォルトのカスケード操作ポリシーを表し、デフォルトは非カスケード操作targetEntity:この属性に関連付けられたエンティティタイプを表す.この属性は通常指定する必要はなく、ORMフレームは属性タイプによって自動的にtargetEntityを判断する.例:
    //    Order     User     ManyToOne    
    //   Order     
    @ManyToOne()
    @JoinColumn(name="USER")
    public User getUser() {
       return user;
    }

9,@JoinColumnオプション@JoinColumnと@Columnは同様であり、メソメトリックは単純なフィールドではなく、関連するフィールド、例えば.@ManyToOneのフィールドを説明します.name:このフィールドの名前.@JoinColumnはManyToOneのような関連フィールドを記述するため、デフォルトの名前は関連するエンティティによって決定される.たとえば、エンティティOrderがエンティティUserを関連付けるuser属性を持つ場合、Orderのuser属性は外部キーであり、デフォルトの名前はエンティティUserの名前+下線+エンティティUserのプライマリ・キー名の例です.@ManyToOne 10、@OneToMany(fetch=FetchType,cascade=CascadeType)オプション@OneToManyを参照して、1対複数の関連を記述します.この属性は集団タイプであるべきで、データベースには実際のフィールドはありません.Fetch:キャプチャポリシーを表し、デフォルトはFetchTypeである.LAZYは、関連付けられた複数のオブジェクトが通常、データベースからメモリcascadeに予め読み込まれる必要がないため、カスケード操作ポリシーを表し、OneToManyタイプの関連付けにとって非常に重要であり、通常、その関連付けられたエンティティも更新または削除されるべきである.例えば、エンティティUserとOrderがOneToManyの関係である場合、エンティティUserが削除される場合、関連付けられたエンティティOrderもすべて削除されるべき例:
    @OneTyMany(cascade=ALL)
    public List getOrders() {
         return orders;
    }

11,@OneToOne(fetch=FetchType,cascade=CascadeType)オプション@OneToOneは、1対1の関連fetchを記述する:キャプチャポリシーを表し、デフォルトはFetchTypeである.LAZYcascade:カスケード操作ポリシーの例を示します.
    @OneToOne(fetch=FetchType.LAZY)
    public Blog getBlog() {
       return blog;
    }

12,@ManyToManyオプション@ManyToManyは1つの多対多の関連を説明する.複数対の複数の関連は2つの1対の複数の関連であるが、ManyToMany記述では、中間テーブルはORMフレームワークによってtargetEntityを自動的に処理する:複数対の複数の関連の別のエンティティクラスのフルネームを表す、例えばpackage.Book.classmappedBy:複数対の複数の関連付けられた別のエンティティクラスを表す対応する集合属性名の例:Userエンティティはユーザーを表し、Bookエンティティは書籍を表し、ユーザーが所蔵する書籍を記述するためにUserとBookの間でManyToMany関連付けを確立することができる
    @Entity
    public class User {
       private List books;
       @ManyToMany(targetEntity=package.Book.class)
       public List getBooks() {
           return books;
       }
       public void setBooks(List books) {
           this.books=books;
       }
    }

 
    @Entity
    public class Book {
       private List users;
       @ManyToMany(targetEntity=package.Users.class, mappedBy="books")
       public List getUsers() {
           return users;
       }
       public void setUsers(List users) {
           this.users=users;
       }
    }

2つのエンティティ間で相互に関連付けられている属性は、@ManyToManyとマークされ、targetEntity属性が相互に指定されている必要があります.ただし、1つのエンティティのみの@ManyToMany注記では、mappedBy属性13、@TransactionAttributeトランザクション管理サービスで最も有用なキャパシタサービスがトランザクション管理サービスである可能性があります.アプリケーションに失敗または例外が発生した場合、データベースの整合性が保証されます.POJOメソッドのトランザクション・プロパティを簡単に説明できます.これにより、コンテナは適切なコンテキストでこの方法を実行することができます.最も一般的なトランザクションはsession beanのメソッドで定義され、メソッド内のすべてのデータベース操作はメソッドが正常に終了したときにのみコミットされ、メソッドが取得されていない例外を投げ出すと、トランザクション管理はすべての変更をロールバックします.@TransactionAttributeコメントは、トランザクションを定義する方法として使用されます.例:@TransactionAttribute(TransactionAttributeType.REQUIRD)public void insertProduct(String name,Float price,boolean error){......}次のパラメータがあります.a.REQUIRD:メソッドは1つのトランザクションで実行され、呼び出されたメソッドが1つのトランザクションにある場合は、そのトランザクションを使用します.そうでなければ、新しいトランザクションが作成されます.b.MANDATORY:メソッドは1つのトランザクションで実行する必要があります.つまり、呼び出されたメソッドにはすでにトランザクションがある必要があります.そうしないと、新しいエラー(ERROR)が投げ出されます.c.REQUIRENEW:メソッドは新しいトランザクションで実行され、呼び出されたメソッドがすでにトランザクションにある場合は古いトランザクションは一時停止されます.d.SUPPORTS:メソッドが1つのトランザクションで呼び出された場合、そのトランザクションが使用されます.そうでない場合、トランザクションは使用されません.e.         NOT_SUPPORTED:メソッドがトランザクションで呼び出されると、エラー(ERROR)が投げ出されます.パラメータが指定されていない場合は、@TransactionAttributeコメントはREQUIRDをデフォルトパラメータとして使用します.14、@PersistenceContextTypePersistenceContextType.EXTENDED.デフォルトでは、EntityManagersはTRANSACTIONのPersistenceContextTypeで作成されます.これは、アクティブなトランザクションが行われている場合にのみ、エンティティが管理可能であることを示します.トランザクションが終了すると、エンティティはエンティティマネージャから離れ、破棄できます.EXTENDEDコンテキストタイプは、トランザクションが終了してもエンティティが管理可能である場合でも、このような離脱は発生しません.これは、エンティティマネージャが必要なリカバリ操作を完了するために使用できるため、コレクションが一時的にフェッチされるかどうかを心配する必要はありません.エンティティを保持および更新/マージしたり、データベースから削除したりする場合は、新しいApplicationエンティティを保存するなど、EntityTransactionを取得する必要があります.
public void saveApplication(Application a) {
   EntityTransaction tx=em.getTransaction();
   tx.begin();
   em.persist(a);
   tx.commit();
}

 
後記:
他のフレームワークやアプリケーションに比べて、playは確かに高速write codeの効果を持っていますが、欠点も明らかです.
1、ORMフレームワークを使用して、プログラムの多くの場所をORMの細部の約束に縛られ、ORMの文法に従ってプログラムを書く必要がある.
2、プロジェクトコードのjarファイル管理に対して、mavenを使うことができなくて、これは管理の難易度を増加します;
3、ORMフレームワークを使用するため、性能上一定の低下があり、最適化に不利である.
4、テーブルのIDはBIGINTフィールドでなければならない.
5、技術の詳細を理解するのに不利である.