JPA全称Java Persistence API.JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中
JPA支持XML和JDK 5.0注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中;
JPA是JAVA EE5平台标准的ORM规范,得到所有的J2EE平台支持。JPA主要包括ORM映射元数据、JPA的API用来操作实体对象执行CRUD操作、查询语言三方面的技术。
ORM元数据的领域对象称为实体(Entity)按JPA的规范,实体具备以下条件:
1 必须使用javax.persistence.Entity注解或在XML映射文件中有对应的元素;(使用JPA就可省去过去复杂的hibernate与model的配置文件)
2 必须具有一个不带参数的构造函数,类不能声明为final,方法和需要持久化的属性也不能声明为final
3 如果游离状的实体对象需要以值得方式进行传递,如通过远程业务接口传递,则必须实现Serializable接口
4 需要持久化的属性 不能是public 必须通过实体类方法访问。
1)
(注意:persistence.xml文件的位置决定持久性的根(Persistence Root)。持久性的根为JAR文件或者包含META-INF目录(前提是persistence.xml位于此)的目录。一般将这个persistence.xml文件放在src下的META-INF中。命名及位置都不能变)
这是网上找的一段代码
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_version=1">
<persistence-unit name="mysqlJPA" transaction-type="RESOURCE_LOCAL">
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />
<property name="hibernate.connection.username" value="root" />
<property name="hibernate.connection.password" value="123456" />
<property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/db1" />
<property name="hibernate.max_fetch_depth" value="3" />
<property name="hibernate.hbm2ddl.auto" value="update" />
</properties>
</persistence-unit>
</persistence>
2 model
@Entity//实体
@Table(name="APP_MOBILE_OS")//表名
@org.hibernate.annotations.Table(appliesTo = "APP_MOBILE_OS", comment = "操作系统表 ")//与数据库表的关联
public class MobileOS extends BaseObject{
private Long id;
private String name;
private String fileName;
private Date createTime;
private Set<MobileUserAgent> mobileUserAgents;
private Integer version;
@Id
@GeneratedValue(strategy= GenerationType.AUTO)
@Column(name="NUMID")//主键的定义
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@Column(name="VC2NAME",unique=true)//惟一的
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Column(name="VC2FILENAME")//字符
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
@Column(name = "DATCREATETIME", length = 7)
@Temporal(value= TemporalType.TIMESTAMP)//时间类型
public Date getCreateTime() {
if(null==createTime)
createTime=new Date();
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
@OneToMany(mappedBy = "mobileOS", fetch = FetchType.LAZY, cascade = {
CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH,CascadeType.REMOVE })
@BatchSize(size=50) //外键Set 一对多的关联
public Set<MobileUserAgent> getMobileUserAgents() {
return mobileUserAgents;
}
public void setMobileUserAgents(Set<MobileUserAgent> mobileUserAgents) {
this.mobileUserAgents = mobileUserAgents;
}
@Version //版本锁javax.persistence.*
public Integer getVersion() {
return version;
}
public void setVersion(Integer version) {
this.version = version;
}
@Override
public String toString() {
return null; //To change body of implemented methods use File | Settings | File Templates.
}}
3)hibernate.cfg.xml配置
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<mapping class="com.xx.model.xx"/>
</session-factory>
</hibernate-configuration>
· 如果我们有些属性不想被持久化到数据表中就使用@Transient
`两个实体使用相同数据表存储,只用一个字段区分时——
父表 @Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "区分字段名",discriminatorType = DiscriminatorType.INTEGER,length = 1)
@DiscriminatorValue(value="1")
在子类的开始处使用@DiscriminatorValue(value="2")
还有很多标签在此没有提到,以后还会补充