jpa实例
ORM框架
新的JPA ORM规范:
1)JPA为POJO提供持久化标准规范。
2)JPA的使用:Hibernate与TopLink以及OpenJpa都提供了JPA的实现。
3)JPA主要技术:
A.ORM映射元数据:JPA通过注解或XML描述映射关系,并将运行中的实体对象持久化到数据库中。
B.JPA持久化API:使用面向对象的思想,操作实体对象,进行增删改查的操作。至于怎么操作,由框架思考这件事。
C.查询语言:使用面向对象的思想避免了同程序的SQL语句产生交集。
LocalContainerEntityManagerFactoryBean 提供了对JPA EntityManagerFactory 的全面控制,
非常适合那种需要细粒度定制的环境。
LocalContainerEntityManagerFactoryBean将基于persistence.xml文件创建PersistenceUnitInfo类,
并提供dataSourceLookup策略和loadTimeWeaver。因此它可以在JNDI之外的用户定义的数据源之上工作,并控制织入流程。
public static void main(String[] args) throws Exception {
@SuppressWarnings("resource")
ApplicationContext context = new ClassPathXmlApplicationContext("context.xml");
Apply apply = (Apply) context.getBean("apply");
System.out.println("---------------");
List<String> list = apply.loadKeys();
}
package com.batman.hzdx.shard.model; import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.Table; import com.batman.hzdx.def.DataTypeUtils;
import com.batman.hzdx.def.HasMapping;
import com.batman.hzdx.def.PrimaryKey; @Entity(name="user")
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public class User implements HasMapping, PrimaryKey<String>, Serializable{
private static final long serialVersionUID = 1L; @Id
@Column(name="username", nullable=false, length=)
private String username; @Column(name="password", nullable=true, length=)
private String password; public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
} public static final String P_Username = "username"; public static final String P_Password = "password"; public String pk() {
return username;
} public Map<String, Serializable> convertToMap() {
HashMap<String, Serializable> map = new HashMap<String, Serializable>();
map.put("username", username);
map.put("password", password);
return map;
} public void updateFromMap(Map<String, Serializable> map) {
if (map.containsKey("username")) this.setUsername(DataTypeUtils.getStringValue(map.get("username")));
if (map.containsKey("password")) this.setPassword(DataTypeUtils.getStringValue(map.get("password"))); } public void fillDefaultValues() {
if (username == null) username = "";
if (password == null) password = "";
}
}
package com.batman.hzdx.shard.model; import static com.mysema.query.types.PathMetadataFactory.*; import com.mysema.query.types.path.*; import com.mysema.query.types.PathMetadata;
import javax.annotation.Generated;
import com.mysema.query.types.Path; /**
* QUser is a Querydsl query type for User
*/
@Generated("com.mysema.query.codegen.EntitySerializer")
public class QUser extends EntityPathBase<User> { private static final long serialVersionUID = -; public static final QUser user = new QUser("user"); public final StringPath password = createString("password"); public final StringPath username = createString("username"); public QUser(String variable) {
super(User.class, forVariable(variable));
} @SuppressWarnings("all")
public QUser(Path<? extends User> path) {
super((Class)path.getType(), path.getMetadata());
} public QUser(PathMetadata<?> metadata) {
super(User.class, metadata);
}
}
package com.batman.hzdx.batch; import java.util.Date;
import java.util.List; import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query; import com.batman.hzdx.shard.model.QPersion;
import com.batman.hzdx.shard.model.QTmAppMain;
import com.batman.hzdx.shard.model.QUser;
import com.mysema.query.Tuple;
import com.mysema.query.jpa.impl.JPAQuery; public class Apply {
@PersistenceContext
private EntityManager em; public List loadKeys() {
String name = "xiaosi";
Query qu2 = em.createNativeQuery("select password from user where username='111'");
List list3 = qu2.getResultList();
System.out.println(list3.toString()); /* QUser qp = new QUser("user");
JPAQuery query = new JPAQuery(em);
List<String> list2 = query.from(qp).where(qp.username.eq(name)).list(qp.password);
System.out.println(list2.toString());*/ QPersion qp5 = new QPersion("persion");
JPAQuery query = new JPAQuery(em);
List<String> list5 = query.from(qp5).where(qp5.name.eq(name)).list(qp5.age);
System.out.println(list5.toString()); return list5;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xsi:schemaLocation="http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.1.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.1.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd"> <!-- 这里定义JPA相关配置。总体上来说,这里使用以Hibernate为Provider的JPA2.0方案,使用Spring来进行集成,不依赖于容器的JPA实现。 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="#{env['jdbcDriver']}" />
<property name="url" value="#{env['jdbcUrl']}" />
<property name="username" value="#{env['jdbcUsername']}" />
<property name="password" value="#{env['jdbcPassword']}" />
<!-- 最大活动连接:连接池在同一时间能够分配的最大活动连接的数量, 如果设置为非正数则表示不限制 -->
<property name="maxActive" value="#{env['jdbcMaxActive'] ?: 20}" />
<!-- 最大空闲连接:连接池中容许保持空闲状态的最大连接数量,超过的空闲连接将被释放,如果设置为负数表示不限制 -->
<property name="maxIdle" value="#{env['jdbcMaxIdle'] ?: 10 }" />
<!-- 最小空闲连接:连接池中容许保持空闲状态的最小连接数量,低于这个数量将创建新的连接,如果设置为0则不创建 -->
<property name="minIdle" value="#{env['jdbcMinIdle'] ?: 2 }" />
<!-- 初始化连接:连接池启动时创建的初始化连接数量 -->
<property name="initialSize" value="#{env['jdbcInitialSize'] ?: 20}" />
<!-- 最大等待时间:当没有可用连接时,连接池等待连接被归还的最大时间(以毫秒计数),超过时间则抛出异常,如果设置为-1表示无限等待 -->
<property name="maxWait" value="#{env['jdbcMaxWait'] ?: 10000 }" />
<!-- 指明是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个 注意: 设置为true后如果要生效,validationQuery参数必须设置为非空字符串 -->
<property name="testOnBorrow" value="#{env['jdbcTestOnBorrow']?: true}" />
<!-- 进行returnObject对返回的connection进行validateObject校验 -->
<property name="testOnReturn" value="#{env['jdbcTestOnReturn']?: false}" />
<property name="validationQuery" value="#{env['jdbcTestSql']}" />
<property name="validationQueryTimeout" value="#{env['jdbcValidationQueryTimeout'] ?: 1}" />
<!-- 空闲时是否进行验证,检查对象是否有效,默认为false -->
<property name="testWhileIdle" value="#{env['jdbcTestWhileIdle']?: false}" />
<!-- 在空闲连接回收器线程运行期间休眠的时间值,以毫秒为单位.如果设置为非正数,则不运行空闲连接回收器线程 -->
<property name="timeBetweenEvictionRunsMillis" value="#{env['jdbcTimeBetweenEvictionRunsMillis']?: 600000}" />
<!-- 连接在池中保持空闲而不被空闲连接回收器线程(如果有)回收的最小时间值,单位毫秒 -->
<property name="minEvictableIdleTimeMillis" value="#{env['jdbcMinEvictableIdleTimeMillis'] ?: 1800000}" />
<!-- 代表每次检查链接的数量,建议设置和maxActive一样大,这样每次可以有效检查所有的链接 -->
<property name="numTestsPerEvictionRun" value="#{env['jdbcMaxActive'] ?: 20}" />
<property name="removeAbandoned" value="#{env['jdbcRemoveAbandoned']?: true}" />
<property name="removeAbandonedTimeout" value="#{env['jdbcRemoveAbandonedTimeout']?: 300}" />
<property name="logAbandoned" value="#{env['jbdcLogAbandoned']?: true}" />
</bean>
<!-- 实体管理类 -->
<bean id="emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<description>
定义EntityManagerFactory,用于Spring控制事务。
具体的Hibernate配置在persistence.xml中控制,包括JPA Provider和Hibernate的各种参数(不含组件扫描)。
</description>
<property name="dataSource" ref="dataSource" />
<property name="persistenceUnitName" value="default" />
<property name="packagesToScan">
<list>
<value>com.batman.hzdx.shard.model</value>
</list>
</property>
<property name="persistenceProviderClass" value="org.hibernate.ejb.HibernatePersistence"/>
<property name="jpaDialect">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect"/>
</property>
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="database" value="#{env['jpaDatabaseType']?:'DEFAULT'}" />
<property name="showSql" value="#{env['jpaShowSql']?:false}" />
</bean>
</property>
<!-- <property name="jpaProperties">
<props>
<prop key="hibernate.jdbc.batch_size"></prop>
</props>
</property> -->
</bean>
<!-- 事务设置 -->
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="emf"/>
</bean> <!-- 事务使用AspectJ进行编译时Weave -->
<tx:annotation-driven mode="aspectj"/> <!-- Spring Data -->
<jpa:repositories base-package="com.batman.hzdx.shared.model"/>
</beans>
jpa实例的更多相关文章
- Spring Data JPA 实例查询
一.相关接口方法 在继承JpaRepository接口后,自动拥有了按"实例"进行查询的诸多方法.这些方法主要在两个接口中定义,一是QueryByExampleExecut ...
- JPA学习---第四节:JPA实例与JPA主键生成策略
1.编写实体类,代码如下: package learn.jpa.bean; import javax.persistence.Entity; import javax.persistence.Gene ...
- Spring data jpa 复杂动态查询方式总结
一.Spring data jpa 简介 首先我并不推荐使用jpa作为ORM框架,毕竟对于负责查询的时候还是不太灵活,还是建议使用mybatis,自己写sql比较好.但是如果公司用这个就没办法了,可以 ...
- 3.JPA开发
转自:https://blog.csdn.net/aspnetandjava/article/details/7034779 1. 什么是JPA 1. JPA(Java Persistence API ...
- SpringBoot12 QueryDSL01之QueryDSL介绍、springBoot项目中集成QueryDSL
1 QueryDSL介绍 1.1 背景 QueryDSL的诞生解决了HQL查询类型安全方面的缺陷:HQL查询的扩展需要用字符串拼接的方式进行,这往往会导致代码的阅读困难:通过字符串对域类型和属性的不安 ...
- 最近学习工作流 推荐一个activiti 的教程文档
全文地址:http://www.mossle.com/docs/activiti/ Activiti 5.15 用户手册 Table of Contents 1. 简介 协议 下载 源码 必要的软件 ...
- JPA实体关系映射:@ManyToMany多对多关系、@OneToMany@ManyToOne一对多多对一关系和@OneToOne的深度实例解析
JPA实体关系映射:@ManyToMany多对多关系.@OneToMany@ManyToOne一对多多对一关系和@OneToOne的深度实例解析 今天程序中遇到的错误一 org.hibernate.A ...
- JPA Hibernate应用实例
1.配置文件:persistence.xml <?xml version="1.0" encoding="UTF-8"?> <persiste ...
- JPA多对多@manytomany注解配置实例
维护端注解 @ManyToMany (cascade = CascadeType.REFRESH) @JoinTable (//关联表 name = "student_teacher&quo ...
随机推荐
- Unix环境高级编程:文件 IO 原子性 与 状态 共享
参考 UnixUnix环境高级编程 第三章 文件IO 偏移共享 单进程单文件描述符 在只有一个进程时,打开一个文件,对该文件描述符进行写入操作后,后续的写入操作会在原来偏移的基础上进行,这样就可以实现 ...
- 解决input中智能提示框onblur与onclick冲突的问题
背景: 制作一个类似百度输入法的智能提示框, 其中当关键词输入进来时,会有智能提示展开,实际需求是当点击智能提示框的汉字时,输入框中自动补全并关闭智能提示, 当点击其他区域时,智能提示框自动隐藏,如下 ...
- vue-router重定向 不刷新问题
前阵子太忙了,自己一个人一边开发着新项目,一边维护着旧项目,没时间写博客,终于让我腾出时间了.废话少说,开始正文. 问题描述: 之前项目是angular开发的,后来用vue重构后.项目路径和vue路径 ...
- .net中反射与IOC容器实现
反射还是很有用的,比如IOC容器基本上都是通过反射实现的. IOC是什么 IOC:Inversion of Control 控制反转是一种是面向对象编程中的一种设计原则,用来减低计算机代码之间的耦合度 ...
- KCF跟踪算法 入门详解
一.算法介绍 KCF全称为Kernel Correlation Filter 核相关滤波算法.是在2014年由Joao F. Henriques, Rui Caseiro, Pedro Martins ...
- 语义SLAM的数据关联和语义定位(二)Semantic Localization Via the Matrix Permanent
论文假设和单目标模型 这部分想讲一下Semantic Localization Via the Matrix Permanent这篇文章的一些假设. 待求解的问题可以描述为 假设从姿态\(x\)看到的 ...
- CSS 实例之打开大门
本个实例主要的效果如下图所示 本案例主要运用到了3D旋转和定位技术.具体步骤如下: 1.首先在页面主体加三个很简单的div标签: <div class="door"> ...
- 【three.js练习程序】拖动选中的物体
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- SQL Server存储过程输入参数使用表值
转载自:http://blog.csdn.net/smithliu328/article/details/9996149 在2008之前如果我们想要将表作为输入参数传递给SQL Server存储过程使 ...
- Android应用耗电量统计,无需USB连接
Android应用耗电量统计一直是一个很头疼的问题,手工统计耗时太长,自动化统计又不是非常精准(执行自动化代码需要通过USB连接,而USB又会充电,这就造成统计数据不准).后来从前辈那里得知可以通过a ...