JPA注記の紹介

10545 ワード

JPA注釈のいくつかのポイント
1.Pojoをエンティティ@Entity//として設定このpojoがjpaエンティティpublic class Users implements Serializable{}であることを識別
2.テーブル名@Entity@Table(name=users)//テーブル名をusers public class Users implements Serializable{}と指定
3.プライマリ・キーpublicの設定
JPA注釈のいくつかのポイント
1.Pojoをエンティティとして設定
@Entity//このpojoがjpaエンティティであることを示す
public class Users implements Serializable {     
}    
2.テーブル名の設定
@Entity     
@Table(name=「users」)/テーブル名をusersと指定
public class Users implements Serializable {     
}    
3.プライマリ・キーの設定
public class Users implements Serializable {     
@Id     
private String userCode;    
4.フィールドタイプの設定
@Column注記設定で、以下の設定が含まれます.
.name:フィールド名
.unique:一意かどうか
.nullable:空にできるかどうか
.inserttable:挿入可能かどうか
.updateable:更新可能かどうか
.columnDefinition:テーブルの作成時にこの列を作成するDDLを定義します.
.secondaryTable:スレーブ名.このカラムがプライマリ・テーブルに構築されていない場合(デフォルトではプライマリ・テーブルに構築されます)、このプロパティはカラムがスレーブ・テーブルにある名前を定義します. 
@Column(name="user_code",nullable=false,length=32)/属性userCodeに対応するフィールドをuser_に設定code、長さ32、非空
private String userCode;     
@Column(name="user_wages",nullable=true,precision=12,scale=2)/属性wagesに対応するフィールドをuser_に設定wages、12桁の数字は2桁の小数を保留することができて、空にすることができます
private double wages;     
@Temporal(TemporalType.DATE)/時間タイプに設定
private Date joinDate;    
5.フィールドのソート
データをロードするときに順序を指定し、@OrderBy注記を使用して実装できます.
@Table(name = "USERS")     
public class User {     
@OrderBy(name = "group_name ASC, name DESC")     
private List books = new ArrayList();     
}    
6.プライマリ・キー生成ポリシー
public class Users implements Serializable {     
@Id     
@GeneratedValue(strategy=GenerationType.IDENTITY)/プライマリ・キーの自己増加、この方法は特定のデータベースに依存します.データベースが自己増加プライマリ・キーをサポートしていない場合、このタイプは使用できません.
@Column(name = "user_id", nullable = false)     
private int userId;     
   
   
public class Users implements Serializable {     
@Id     
@GeneratedValue(strategy=GenerationType.TABLE)/プライマリ・キーidの自己増加は、特定のデータベースに依存せず、データ移行の問題を解決するテーブルで実現
@Column(name = "user_code", nullable = false)     
private String userCode;     
   
   
public class Users implements Serializable {     
@Id     
@GeneratedValue(strategy=GenerationType.SEQUENCE)/Sequenceによるテーブルプライマリ・キーの自己増加は、データベースにSEQUENCEがあるかどうかに依存し、なければ使用できません
@SequenceGenerator(name="seq_user")     
@Column(name = "user_id", nullable = false)     
private int userId;    
7.一対のマルチマッピング関係
T_があるOneとT_Many 2つのテーブル、彼らは1対多の関係で、注釈の例は以下の通りです.
メインPojo
@Entity     
@Table(name = "T_ONE")     
public class One implements Serializable {     
private static final long serialVersionUID = 1L;     
@Id     
@Column(name = "ONE_ID", nullable = false)     
private String oneId;     
@Column(name = "DESCRIPTION")     
private String description;     
@OneToMany(cascade=CascadeType.ALL,mappedBy="oneId")//複数の方へのpojoの関連外部キーフィールド
private Collection manyCollection;     
子Pojo
@Entity     
@Table(name = "T_MANY")     
public class Many implements Serializable {     
private static final long serialVersionUID = 1L;     
@Id     
@Column(name = "MANY_ID", nullable = false)     
private String manyId;     
@Column(name = "DESCRIPTION")     
private String description;     
   
@JoinColumn(name="ONE_ID",referencedColumnName="ONE_ID")//対応するデータテーブルのカラム名と参照するデータテーブルのカラム名を設定
@ManyToOne//「一方」pojoの外部キーフィールドに設定
private One oneId;     
8.多対多マッピング関係
多対多関係はカスケードを設ける必要はないようで、以前はhibernateを使っていたときは多対多のカスケードに頭を悩ませていたが、JPAの多対多は実際に試してみる必要がある. 
JPAの多対多も2つの1対多に変換できると推定される. 
最初のPojo
@Entity     
@Table(name = "T_MANYA")     
public class ManyA implements Serializable {     
private static final long serialVersionUID = 1L;     
@Id     
@Column(name = "MANYA_ID", nullable = false)     
private String manyaId;     
@Column(name = "DESCRIPTION")     
private String description;     
@ManyToMany     
@JoinTable(name = "TMANY1_TMANY2", joinColumns = {@JoinColumn(name = "MANYA_ID", referencedColumnName = "MANYA_ID")}, inverseJoinColumns = {@JoinColumn(name = "MANYB_ID", referencedColumnName = "MANYB_ID")})     
private Collection manybIdCollection;     
2番目のPojo
@Entity     
@Table(name = "T_MANYB")     
public class ManyB implements Serializable {     
private static final long serialVersionUID = 1L;     
@Id     
@Column(name = "MANYB_ID", nullable = false)     
private String manybId;     
@Column(name = "DESCRIPTION")     
private String description;     
@ManyToMany(mappedBy = "manybIdCollection")     
private Collection manyaIdCollection;     
9.一対一のマッピング関係
メインPojo
@Entity     
@Table(name = "T_ONEA")     
public class OneA implements Serializable {     
private static final long serialVersionUID = 1L;     
@Id     
@Column(name = "ONEA_ID", nullable = false)     
private String oneaId;     
@Column(name = "DESCRIPTION")     
private String description;     
@OneToOne(cascade=CascadeType.ALL,mappedBy="oneA")//メインPojoの方の設定は簡単で、Pojoからの外部キーにカスケードとマッピングを設定すればOKです.     
private OneB oneB;    
Pojoから
@Entity     
@Table(name = "T_ONEB")     
public class OneB implements Serializable {     
private static final long serialVersionUID = 1L;     
@Id     
@Column(name = "ONEA_ID", nullable = false)     
private String oneaId;     
@Column(name = "DESCRIPTION")     
private String description;     
@JoinColumn(name="ONEA_ID",referencedColumnName="ONEA_ID",insertable=false,updatable=false)//マスターへの関連外部キーを設定し、このONEA_IDは実はテーブルT_ONEAのキー
@OneToOne     
private OneA oneA;     
10フィールド
@Lob//対応Blobフィールドタイプ
@Column(name = "PHOTO")     
private Serializable photo;     
@Lob//対応Clobフィールドタイプ
@Column(name = "DESCRIPTION")     
private String description;    
11.瞬時フィールド
データベースにマッピングされたフィールドは必要ありません.保存時に逆データベースを保存する必要はありません.
@Transient     
private int tempValue;     
   
public int getTempValue(){     
get tempValue;     
}     
   
public void setTempValue(int value){     
this.tempValue = value;     
@Entity                           --       bean    
@Table (name= "promotion_info" )    --   bean     (  ="promotion_info)    
@Id                               --      bean         
@GeneratedValue                   --             .    
@Transient                        --          ,             
@Column (name= "promotion_remark" )--   (   = "promotion_total" )      (length= 200  )    
@Temporal (TemporalType.TIMESTAMP)--          
@Enumerated                       --        
@Version                          --                
@OneToOne                         --      bean             
@OneToMany                        --      bean             
@ManyToOne                        --      bean             
@ManyToMany                       --      bean             
@Formula                          --  SQL   ,        ,         (    sum、average、max )   



@Entity    
@Table (name= "promotion_info" )    
public class Promotion implements Serializable {    
   
     //AUTO--   identity     ,  sequence    table  ,               
     @Id    
     @GeneratedValue (strategy = GenerationType.AUTO)    
     private Long id;    
   
     @Column (name= "group_start_amount" )    
     private Integer groupStartAmount= 0 ;    
        
     @Column (name= "promotion_remark" ,length= 200 )    
     //@Lob                 length=200          
     private String remark;    
     //DATE       - java.sql.Date    
     //TIME       - java.sql.Time    
     //TIMESTAMP - java.sql.Timestamp    
     @Temporal (TemporalType.TIMESTAMP)    
     @Column (name= "start_time" )    
     private Date startTime;    
   
     //  0   1    
     public static enum DisplayType {    
           ,      
     }    
     @Enumerated (value = EnumType.ORDINAL) //ORDINAL      
     private DisplayType displayType = DisplayType.  ;    
   
     @Version    
     private Integer version;    
   
     //CascadeType.PERSIST    --       (create)    
     //CascadeType.MERGE      --       (update)    
     //FetchType.LAZY         --         
     @ManyToOne (cascade = {CascadeType.PERSIST,CascadeType.MERGE},fetch = FetchType.LAZY)    
     private PromotionGroup promotionGroup;    
   
     //  ManyToMany    
     //@JoinTable(     )    
     //joinColumns -- promotion           
     //inverseJoinColumns -- largess           
     @ManyToMany (cascade = {CascadeType.PERSIST,CascadeType.MERGE})    
     @JoinTable (name= "promotion_largess" ,joinColumns={ @JoinColumn (name= "promotion_id" )},inverseJoinColumns={ @JoinColumn (name= "largess_id" )})    
     private Set largess;    
   
     //get set   ....    
   
}    
@Entity    
@Table (name= "promotion_group" )    
public class PromotionGroup implements Serializable {    
     @Id    
     @GeneratedValue (strategy = GenerationType.AUTO)    
     private Long id;    
        
     //mappedBy  "promotionGroup"  owner(Promotion)      ,           
     @OneToMany (mappedBy= "promotionGroup" ,cascade=CascadeType.ALL)    
     private List promotion;    
   
     //get set   ....    
}    
@Entity    
@Table (name= "largess" )    
public class Largess implements Serializable {    
     @Id    
     @GeneratedValue (strategy = GenerationType.AUTO)    
     private Long id;    
   
     //1.sql                  ,        ,    
     //      la.id= id,  =id          
     //2.              
     @Formula (select max(la.id) from largess as la)    
     private int maxId;    
   
     @Formula (select COUNT(la.id) from largess la)    
     private int count;    
   
     @Transient    
     private String img    
   
     //get set   ....    
}