1.每当一个新的实体被创建并被持久化到entity manager服务中时,必有一条记录被插入到数据库,同时必有一个bean实例与该数据库相关联。
保持bean实例所代表的数据与数据库中的数据协调一致的过程称为持久化。
2.当创建一个持久化类的时候,Java Persistence 只要两端元数据,注解@javax.persistence.Entity指明了应当将该类映射到数据库。
注解@java.persistence.Id则标识了在你的类里,哪个成员属性会用作主键。Persistence provider 会假定,类中所有其余的成员属性各自被映射到具有相同名称和形同类型的数据库字段上,而默认表名将会是bean class 的非限定类名。
注解@javax.persistence.Entity告知persistence provider 该类可以被持久化。
持久化成员属性的方式:Java bean 风格 和Java 数据成员风格。
若将@Id注解至于getter成员函数之上,那么就必须将任何用于映射的其他注解置于该类的getter或setter的成员方法之上;若将@Id注解置于类的数据成员之上,Persistence provider会假定,类中的其他成员数据也是持久化成员属性。
xml映射文件可以代替注解声明元数据。例:
<entity-mapping>
<entity class = "com.tian.domain.Custiomer" access="PROPERTY">
<attributes>
<id name = "id">
</attributes>
</entity>
</entity-mapping>
3.基本的关系映射:Java对象模型------>数据库schema 或
数据库schema-------->Java对象模型
4.基本的schema 映射
若要将Customer实体类映射到一个已经存在的表,或着要将实体类中映射到指定到自己定义的字段上,要使用@java.persistence.Table和@javax.persistence.Column以让映射生效。
@Entity指明了应当将该类映射到数据库。属于包: javax.persistence;
例:
import javax.persistence.*;
@Entity
@Table (name = "CUSTOMER_TABLE")
public class Customer implements java.io.Serializable {
private long id;
private String firstName;
private String lastName;
@Id
@Column (name = "CUST_ID",nullable = false,columnDefinition = "integer")
public long getId ( ) { return id; }
public void (long id) { this.id = id; }
@Column ( name = "FIRST_NAME",length = 20,nullable = false)
public String getFirstName ( ) { return firstName; }
public void setFirstName (String firstName) { this.firstName = firstName; }
}
@Table
注解@javax.persistence.Table 告知EntityManager为bean class 映射的关系表提供服务,
注解的定义为:
package javax.persistence;
@Target ( { TYPE } ) @Retention (RUNTIME)
public @interface Table {
String name () default " " ;
String catelog ( ) default " " ;
String schema ( ) default " ";
UniqueConstraint [ ] uniqueConstraints ( ) default ( ) ;
}
@Column用于指定数据库中各字段的属性名和类型等,
注解的定义:
public @interface Column {
String name ( ) default " ";
boolean unique ( ) default false;
boolean nullable ( ) default true;
boolean insertable ( ) default true;
boolean updateable ( ) default true;
String columnDefinition ( ) default " ";
String table ( ) default " "; //用于多表映射
int length ( ) default 255;
int precision ( ) default 0; //用于数值性成员属性
int scale ( ) default 0; //用于数值性成员属性
}
@Id 定义主键(Primary Keys )
主键给定entity bean 的一个标识。每个entity bean 必须有一个主键,并且必须是唯一的。可以为entity bean 手工生成主键,也可以让 persistence provider 为你代劳。当你想让persistence provider 生成主键时,就必须使用@javax.persistence.GeneratedValue.
注解的定义为:
package javax.persistence;
@Target ( { METHHOD,FIELD }) @Retention (RUNTIME)
public @interface Id {
}
@Transient
为entity bean 到成员属性(或get() set()方法)添加该注解时,persistence manager 会忽略该成员属性,而不将其持久化。
(在数据持久化时,persistence manager 会假定,bean class 中的每个非瞬时成员属性都是持久化的。这对于为持久化对象快速构造原型大有裨益,但缺省的做法未必总是恰当的。)
全:@javax.persistence.Transient
@Basic 注解是持久化成员变量映射的最简单形式。这是成员变量属性的默认映射方式,这些成员变量的对应类型包括:基本数据类型及其封装类型,如下
java.lang.String byte[ ] Byte[ ] char[ ] Character[ ];
java.math.BigInteger java.math.BigDecimal;
java.util.Date java.util.Calendar;
java.sql.Date java.sql.Time java.sql.Timestamp;
不必显式地告诉persistence manager你正在映射一个basic 类型的成员属性,因为它通常会通过成员属性的类型判断出应当如何将其映射到JDBC。
注解的定义:
public @interface Basic {
FetchType fetch ( ) default EAGER;
boolean optional ( ) default true;
}
public enum FetchType {
LAZY,EAGER
}
假如fetch ()属性是LAZY,那末直到你真正访问该数据成员时,成员属性才会被初始化。但fetch()不是一个带有强制效力的的属性,规范依然persistence provider以立即方式加载成员属性。optional() 属性是在persistence provider 为你生成数据库表时使用的。当该属性设置为true 时,相应到成员属性会被看成是可以为空的。
@Termporal 为persistence provider提供了映射java.util.Date或java.util.Calendar类型的成员变量的附加信息。该注解允许你将上述的对象映射到数据库中date time 或timestamp类型的字段上。缺省情况下,persistence provider假定时间类型(temporal type) 为timestamp.
注解的定义:
package javax.persistence;
public enum TemporalType {
DATE,
TIME,
TIMESTAMP
}
public @interface Temporal {
TemporalType value ( ) default TIMESTAMP;
}
例:在getter或setter方法前加@Temporal (TemporalType.TIME),则相应的属性将以TIME属性保存到数据库中。
@Lob被用来映射数据成员是图片、大文本等大对象类型。
被标注@Lob的成员属性会被持久化成:Blob(二进制数据)类型,如果原始数据类型是byte[ ] ,Byte[ ] 或java.io.Serializable;Clob(字符型数据),如果原始数据类型是char[ ] Character[ ] 或java.lang.String。
注解的定义:
package javax.persistence;
public @interface Lob {
}
@Lob 通常于@Basic注解结合使用,以提醒成员属性应该被延迟加载。
例句:
...
@Lob
@Basic (fetch=FetchType.LAZY)
public JPEG getPicture ( ) { return picture; }
public void setPicture ( ) { this.picture = picture; }
...
@Enumerated用于将Java的enum类型映射到数据库。它与@Basic注解结合使用,是你能够指定附加的fetch语义。
注解的定义:
package javax.persistence;
public enum EnumType {
ORDINAL,
STRING
}
public @interface Enumerated {
EnumType value ( ) default ORDINAL;
}
例句:
...
@Enumerated(EnumType.STRING)
@Basic(fetch = FetchType.LAZY)
public CustomerType getCustomerType ( ) { return customerType; }
public void setCustomerType( CustomerType type) {customerType = type; }
...
不必非得使用@Enumerated注解来映射成员属性。假如省略该注解,默认会选择EnumType的ORDINAL取值。