JPA注記の紹介
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;
}
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 ....
}