此处以hibernate为例
第一步:导入相关的jar包,除了导入hibernate3.2.jar以外,为了能使用jpa,我们还要导入hibernate-entitymanager-3.4.0.GA里的几个jar包,分别为:hibernate-entitymanager.jar,ejb3-persistence.jar,hibernate-annotations.jar,hibernate-commons-annotations.jar
第二步:在类路径下也就是src目录下创建一个文件夹META-INF,在文件夹中创建persistence.xml配置文件,代码如下
<?xml version="1.0"?>
<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_1_0.xsd" version="1.0">
<persistence-unit name="shop" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/>
<property name="hibernate.connection.driver_class" value="org.gjt.mm.mysql.Driver"/>
<property name="hibernate.connection.username" value="root"/>
<property name="hibernate.connection.password" value="5993856"/>
<property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/shop?useUnicode=true&characterEncoding=UTF-8"/>
<property name="hibernate.max_fetch_depth" value="3"/>
<property name="hibernate.hbm2ddl.auto" value="update"/>
<property name="hibernate.jdbc.fetch_size" value="18"/>
<property name="hibernate.jdbc.batch_size" value="10"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
</properties>
</persistence-unit>
</persistence>
第三步:我们来创建一个实体类测试一下我们的配置
Company.java
@Entity
@Table(name = "company")
public class Company {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
@Column(name = "c_name", length = 50, nullable = false)
private String name;
@Column(columnDefinition = "text")
private String description;
@OneToMany(mappedBy = "company", fetch = FetchType.LAZY, cascade = CascadeType.REMOVE)
private List<Employee> employees;
public Company() {
this.employees = new ArrayList<Employee>();
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public List<Employee> getEmployees() {
return employees;
}
public void setEmployees(List<Employee> employees) {
this.employees = employees;
}
}
Employee.java
@Entity
@Table(name = "fin_employee")
public class Employee {
private long id;
private String name;
private Company company;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "company_id")
public Company getCompany() {
return company;
}
public void setCompany(Company company) {
this.company = company;
}
@Transient
public String getCompanyName() {
return this.company.getName();
}
}
在上面的Java类中, 我们可以看到,所有以@开头的标注都是JPA标注,JPA标注可以写在属性名前,也可以写在属性的get方法前,接下来逐一介绍这些基本标注的意思。
【注释说明】
@Entity
将普通的Java类指定为实体,默认情况下,所有Java类为非持久化类,@Table指定映射数据表名,默认情况下以类名作为数据表名,如非特殊指定,可以省略该注释项。
@Id
@GeneratedValue:主键的产生策略,通过strategy属性指定。默认情况下,JPA自动选择一个最适合底层数据库的主键生成策略,如SqlServer对应identity,MySql对应auto increment。在javax.persistence.GenerationType中定义了以下几种可供选择的策略:
1) IDENTITY:表自增键字段,Oracle不支持这种方式;
2) AUTO: JPA自动选择合适的策略,是默认选项;
3) SEQUENCE:通过序列产生主键,通过@SequenceGenerator注解指定序列名,MySql不支持这种方式;
4) TABLE:通过表产生主键,框架借由表模拟序列产生主键,使用该策略可以使应用更易于数据库移植。不同的JPA实现商生成的表名是不同的,如OpenJPA生成openjpa_sequence_table表Hibernate生成一个hibernate_sequences表,而TopLink则生成sequence表。这些表都具有一个序列名和对应值两个字段,如SEQ_NAME和SEQ_COUNT。
@Column(name = "c_name", length = 50, nullable = false)我们并不需要指定表字段的类型,因为JPA会根据反射从实体属性中获取类型;如果是字符串类型,我们可以指定字段长度,以便可以自动生成DDL语句
private String name;
name: 默认情况下,JPA会根据属性名生成数据表字段名,使用name属性我们可以自己进行特殊指定。
length: 字段长度
nullable: 字段是否允许为空
@Temporal(TemporalType.DATE):如果属性是时间类型,因为数据表对时间类型有更严格的划分,所以必须指定具体时间类型,如④所示。在javax.persistence.TemporalType枚举中定义了3种时间类型:
1) DATE :等于java.sql.Date
2) TIME :等于java.sql.Time
3) TIMESTAMP :等于java.sql.Timestamp
@Column(columnDefinition = "text")
private String description;
columnDefinition: 设置为在针对列生成DDL时希望JPA使用的SQL片断.
此设置与数据库绑定, 即切换数据库的时候可能需要进行修改.
@OneToMany(mappedBy = "company", fetch = FetchType.LAZY, cascade = CascadeType.REMOVE)
private List<Employee> employees;
@OneToMany: 声明一对多关联映射, 即一个公司对应多个雇员
mappedBy: 如果关联是单项的,该数据表维护关联关系
如双向关联(当前情况),在一方设置mappedBy属性,对应多方关联一方的属性名称。
让我们来看下一方的设置:
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "company_id")
public Company getCompany() {
return company;
}
在多方Employee方, 关联的属性名为company, 所以在一方设置的mappedBy值为company
@JoinColumn: 定义外键的列名
默认情况下, 无需配置, JPA默认以属性名+"_id"方式自动生成该外键列.
如需特殊指定, 设置name属性
fetch: 取得当前对象的时候, 是否加载关联对象
LAZY: 延迟加载策略, 获取当前对象时, 不加载级联对象, 会在首次load或get级联对象的时候加载
EAGER: 迫切获取加载策略, 获取当前对象时, 立即加载级联对象
cascade: 操作级联对象策略
ALL: 针对拥有实体执行的任何持续性操作均级联到关联的目标
MERGE: 如果合并了拥有实体, 则将 merge 层叠到关联的目标
PERSIST: 如果持久保存拥有实体, 则将 persist 层叠到关联的目标
REFRESH: 如果刷新了拥有实体, 则 refresh 为关联的层叠目标
REMOVE: 如果删除了拥有实体,则还删除关联的目标
当前例子设置为remove, 即在删除company对象时, 会级联删除所关联的employee对象
如不进行remove设置, 在删除操作时, 系统会报外键约束异常
@Transient默认情况下, JPA 持久化提供程序假设实体的所有字段均为持久字段
即所有属性都会映射到数据表字段
如需在实体增加方法, 但又不想进行映射, 使用此注释
分享到:
相关推荐
使用 JPA,您可以将任何普通的旧式 Java 对象 (POJO) 类指定为 JPA 实体:一个应使用 JPA 持续性提供程序的服务将其非临时字段持久保存到关系数据库(在 Java EE EJB 容器的内部或在简单 Java SE 应用程序中的 EJB ...
内容包括整体认识JPA、JPA基础查询方法、定义查询方法、注解式查询方法、@Entity实例里面常用注解详解、JpaRepository扩展详解、JPA的MVC扩展REST支持、DataSource的配置、乐观锁、SpEL表达式在SpringData里面的应用...
使用 JPA,您可以将任何普通的旧式 Java 对象 (POJO) 类指定为 JPA 实体:一个应使用 JPA 持续性提供程序的服务将其非临时字段持久保存到关系数据库(在 Java EE EJB 容器的内部或在简单 Java SE 应用程序中的...
JPA应用注解中文参考 使用 JPA 时,可以使用批注配置实体的 JPA 行为。批注是一种使用元数据修饰 Java 源代码的简单表达方法,它编译为相应的 Java 类文件,以便在运行时由 JPA 持续性提供程序解释以管理 JPA 行为。
在JPA 之前,Java EE 应用...使用JPA 时,可以使用批注配置实体的JPA 行为。批注是一种使用元数据修饰Java 源代码 的简单表达方法,它编译为相应的Java 类文件,以便在运行时由JPA 持续性提供程序解释以 管理JPA 行为。
这是一个简单的 Web 应用程序,展示了如何配置 spring-mvc 和 spring-data。 有一个简单的登录功能,如果用户凭据正确,用户将被转发到一个主页,其中所有订单的列表显示在 html 表中。 数据库很简单:用户和订单,...
JPA应用注解中文参考 使用 JPA 时,可以使用批注配置实体的 JPA 行为。批注是一种使用元数据修饰 Java 源代码的简单表达方法,它编译为相应的 Java 类文件,以便在运行时由 JPA 持续性提供程序解释以管理 JPA 行为。
spring-data-jpa-example 使用 spring 数据 JPA 的简单应用程序示例。安装指南安装 Java jdk 1.8 安装 Maven 3.x 设置环境变量 JAVA_HOME 设置环境变量 MAVEN_HOME 将 JAVA_HOME\bin 和 MAVEN_HOME\bin 放在环境变量...
它是通过在应用程序端完全实现时功能来实现的,因此它可以与JPA集成到的所有DB引擎一起使用最少的配置来工作。 更具体地说,您的表成为“系统版本表”。 以下摘录来自 : 系统版本表 通常,当您发出更新表上一行...
客户关系管理演示这是一个简单的展示,展示了如何使用 Angular.js 和 Java EE 6(JAX-RS 和 JPA 2.0)构建 Web 应用程序。 要部署,只需将 war 复制到 Jboss AS 7.1 的“standalone/deployments”目录。 您还可以...
一个简单的Spring Boot演示应用程序,演示了如何一起使用Spring Security,Thymeleaf,JPA,Postgres和Customized Bootstrap。 在此应用程序中,我们通过Spring Boot安装并使用了Node.js和其他节点模块,而没有运行...
EasyJpa上手简单,只要有数据源连接,甚至可以不需要多余的配置,你就可以将EasyJpa轻松应用到你工程的道层,各种凝结操作更容易了。 无创性 EasyJpa遵循Java Persistence API规范,使用javax.persistence相关的注解...
它利用Spring Web MVC,带有Hibernate实现的Spring Data JPA和Spring Security。 实时网站: : 范围这注定是一个入门者。 它配置有用于实现最佳实践身份验证方案的用户和角色数据模型。 该应用程序设置了两个预先...
简单来说,Spring是一个分层的JavaSE/EE full-stack(一站式) 轻量级开源框架 Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。...
141 9.1.2 JSF应用程序配置 142 9.2 一个简单的JSF应用 142 9.2.1 JSF应用程序开发步骤 143 9.2.2 用户登录实例 143 9.3 JSF应用程序架构 147 9.3.1 JSF请求处理生命周期 147 9.3.2 JSF事件驱动模型 148 9.3.3 JSF...
约定优于配置,简单来说就是你所期待的配置与约定的配置一致,那么就可以不做任何配置,约定不符合期待时才需要对约定进行替换配置。 特征: 1. SpringBoot Starter:他将常用的依赖分组进行了整合,将其合并到一...
帮助您开始使用基本的JPA支持的应用程序和集成库。 对于较大的应用程序,请考虑为您的UI代码应用一些众所周知的设计模式。 检查例如。 如何玩这个例子 建议的方法 克隆项目 导入到您喜欢的IDE 从Application类...
版本0.0.2已发布:完成了第一个生成数据的版本,在此版本中,我们已经可以生成标头和简单数据JPA实体,并且至少将一个接口类型ManyToOne作为子实体视为字符串。 删除了不必要的依赖 是什么让我想要开发这个项目: ...
spring-boot-jpa-thymeleaf-tutorial 这是一个简单的 Java Web 开发教程。 应用技术 Java SE 8 Apache Maven 3+(构建工具) ...注释 Application 类以启用自动配置、组件扫描并创建main()方法才能启动应用程序 使用s
使用Java EE 7,JPA和RESTful Web服务的基于微服务的应用程序。 为野蝇或玻璃鱼容器准备。 整合测试 为了进行集成测试,我为Arquillian添加了2个配置文件,分别用于草鱼4.1和Wildfly 8.2容器。 运行集成测试 sh ...