JPA使用

来源:互联网 发布:深圳行知职业学校地铁 编辑:程序博客网 时间:2024/06/01 19:49

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")


还有很多标签在此没有提到,以后还会补充