Maven 版 JPA 最佳实践(转)

项目结构图

数据库环境

  • 数据库:MySQL
  • 版本:5.x
  • 数据库名:jpa-demo
  • 用户名密码:root/1234

代码清单 1:数据库脚本:

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

/*

Navicat MySQL Data Transfer

 

Source Server : localhost

Source Server Version : 50525

Source Host : localhost:3306

Source Database : jpa-demo

 

Target Server Type : MYSQL

Target Server Version : 50525

File Encoding : 65001

 

Date: 2014-11-20 20:09:27

*/

 

SET FOREIGN_KEY_CHECKS=0;

 

-- ----------------------------

-- Table structure for `address`

-- ----------------------------

DROP TABLE IF EXISTS `address`;

CREATE TABLE `address` (

`addressID` int(11) NOT NULL,

`city` varchar(55) NOT NULL,

`street` varchar(55) NOT NULL,

`zip` varchar(8) NOT NULL,

PRIMARY KEY (`addressID`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 

-- ----------------------------

-- Records of address

-- ----------------------------

INSERT INTO `address` VALUES ('1', '深圳', '坂田市场', '518001');

INSERT INTO `address` VALUES ('2', '深圳', '坂田路口', '518002');

INSERT INTO `address` VALUES ('3', '深圳', '四季花城', '518003');

 

-- ----------------------------

-- Table structure for `userinfo`

-- ----------------------------

DROP TABLE IF EXISTS `userinfo`;

CREATE TABLE `userinfo` (

`userID` int(11) NOT NULL,

`username` varchar(20) NOT NULL,

`birthday` datetime DEFAULT NULL,

`sex` varchar(8) NOT NULL,

`addressID` int(11) NOT NULL,

PRIMARY KEY (`userID`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 

-- ----------------------------

-- Records of userinfo

-- ----------------------------

INSERT INTO `userinfo` VALUES ('1', '张金雄', null, 'male', '1');

INSERT INTO `userinfo` VALUES ('2', '李某某', null, 'male', '2');

INSERT INTO `userinfo` VALUES ('3', '王某某', '2006-08-10 00:00:00', 'female', '3');

INSERT INTO `userinfo` VALUES ('4', '陈某某', '2006-08-12 00:00:00', 'male', '3');

源代码

代码清单 2:pom.xml

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

<modelVersion>4.0.0</modelVersion>

<groupId>com.coderdream</groupId>

<artifactId>jpa-demo</artifactId>

<packaging>war</packaging>

<version>0.0.1-SNAPSHOT</version>

<name>jpa-demo Maven Webapp</name>

<url>http://maven.apache.org</url>

<properties>

<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

<junit.version>4.11</junit.version>

<mysql.version>5.1.17</mysql.version>

<slf.version>1.7.5</slf.version>

<toplink.essentials.version>2.1-60f</toplink.essentials.version>

</properties>

 

<dependencies>

<dependency>

<groupId>junit</groupId>

<artifactId>junit</artifactId>

<version>${junit.version}</version>

<scope>test</scope>

</dependency>

 

<dependency>

<groupId>toplink.essentials</groupId>

<artifactId>toplink-essentials</artifactId>

<version>${toplink.essentials.version}</version>

</dependency>

 

<dependency>

<groupId>toplink.essentials</groupId>

<artifactId>toplink-essentials-agent</artifactId>

<version>${toplink.essentials.version}</version>

</dependency>

 

<dependency>

<groupId>org.slf4j</groupId>

<artifactId>slf4j-log4j12</artifactId>

<version>${slf.version}</version>

</dependency>

 

<dependency>

<groupId>mysql</groupId>

<artifactId>mysql-connector-java</artifactId>

<version>${mysql.version}</version>

</dependency>

</dependencies>

<build>

<finalName>jpa-demo</finalName>

</build>

</project>

代码清单 3:persistence.xml

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

<?xml version="1.0" encoding="UTF-8"?>

<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="piscesPU" transaction-type="RESOURCE_LOCAL">

<provider>

oracle.toplink.essentials.PersistenceProvider

</provider>

<class>com.coderdream.model.UserInfo</class>

<class>com.coderdream.model.Address</class>

<properties>

<!-- 数据库连接配置, JDBC驱动 -->

<property name="toplink.jdbc.driver" value="com.mysql.jdbc.Driver" />

<!-- 数据库连接配置,URL -->

<property name="toplink.jdbc.url" value="jdbc:mysql://localhost:3306/jpa-demo" />

<!-- 数据库连接配置, 用户名 -->

<property name="toplink.jdbc.user" value="root" />

<!-- 数据库连接配置, 密码 -->

<property name="toplink.jdbc.password" value="1234" />

</properties>

</persistence-unit>

 

</persistence>

代码清单 4:Address.java

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

package com.coderdream.model;

 

import java.io.Serializable;

import javax.persistence.Column;

import javax.persistence.Entity;

import javax.persistence.Id;

 

@Entity

public class Address implements Serializable {

// 地址id, 不能为空, 必须唯一

@Id

@Column(name = "addressid", unique = true, nullable = false)

private int addressid;

 

// 城市, 不能为空

@Column(name = "city", nullable = false)

private String city;

 

// 街道, 不能为空

@Column(name = "street", nullable = false)

private String street;

 

// 邮政编码, 不能为空

@Column(name = "zip", nullable = false)

private String zip;

 

public Address() {

}

 

public Address(int addressid) {

this.setAddressid(addressid);

}

 

public int getAddressid() {

return this.addressid;

}

 

public void setAddressid(int addressid) {

this.addressid = addressid;

}

 

public String getCity() {

return this.city;

}

 

public void setCity(String city) {

this.city = city;

}

 

public String getStreet() {

return street;

}

 

public void setStreet(String street) {

this.street = street;

}

 

public String getZip() {

return this.zip;

}

 

public void setZip(String zip) {

this.zip = zip;

}

 

@Override

public int hashCode() {

return this.addressid;

}

 

@Override

public boolean equals(Object object) {

if (!(object instanceof Address))

return false;

final Address other = (Address) object;

return this.addressid == other.addressid;

}

 

@Override

public String toString() {

return "Address[addressid=" + getAddressid() + ", city='" + getCity() + "', street='" + getStreet() + "', zip='" + getZip() + "";

}

}

代码清单 5:UserInfo.java

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

package com.coderdream.model;

 

import java.io.Serializable;

import java.sql.Timestamp;

import javax.persistence.Column;

import javax.persistence.Entity;

import javax.persistence.Id;

import javax.persistence.JoinColumn;

import javax.persistence.OneToOne;

import static javax.persistence.CascadeType.*;

 

@Entity

public class UserInfo implements Serializable {

// 用户id, 不能为空, 必须唯一

@Id

@Column(name = "userid", unique = true, nullable = false)

private int userid;

 

// 用户名, 不能为空

@Column(name = "userName", nullable = false)

private String userName;

 

// 性别, 不能为空

@Column(name = "sex", nullable = false)

private String sex;

 

// 出生日期, 可以为空

@Column(name = "birthday")

private Timestamp birthday;

 

// 地址, 不能为空

// PERSIST 表示更新、新增UserInfo数据时会同时更新、新增Address的数据

// REMOVE 表示从数据库删除UserInfo会同时删除Address表中对应的数据

@OneToOne(cascade = { PERSIST, REMOVE })

@JoinColumn(name = "addressID", nullable = false)

private Address address;

 

public UserInfo() {

}

 

public UserInfo(int userid) {

this.setUserid(userid);

}

 

@Override

public int hashCode() {

return this.getUserid();

}

 

@Override

public boolean equals(Object object) {

if (!(object instanceof UserInfo))

return false;

final UserInfo other = (UserInfo) object;

return this.userid == other.userid;

}

 

@Override

public String toString() {

return "UserInfo[userid=" + this.userid + ", userName='" + userName + "', sex='" + sex + "', birthday=" + birthday + ", address="

+ address + "";

}

 

public int getUserid() {

return userid;

}

 

public void setUserid(int userid) {

this.userid = userid;

}

 

public String getUserName() {

return userName;

}

 

public void setUserName(String userName) {

this.userName = userName;

}

 

public Timestamp getBirthday() {

return birthday;

}

 

public void setBirthday(Timestamp birthday) {

this.birthday = birthday;

}

 

public String getSex() {

return sex;

}

 

public void setSex(String sex) {

this.sex = sex;

}

 

public Address getAddress() {

return address;

}

 

public void setAddress(Address address) {

this.address = address;

}

}

代码清单 6:SimpleService.java

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

package com.coderdream.service;

 

import java.util.List;

 

import javax.persistence.EntityManager;

import javax.persistence.EntityManagerFactory;

import javax.persistence.Persistence;

 

import com.coderdream.model.Address;

import com.coderdream.model.UserInfo;

 

public class SimpleService {

 

/**

* 删除用户id=6的数据

*/

public static void delete() {

final EntityManagerFactory emf = Persistence.createEntityManagerFactory("piscesPU");

final EntityManager em = emf.createEntityManager();

// 找不到数据的话这里会抛异常

UserInfo info = em.find(UserInfo.class, 6);

try {

em.getTransaction().begin();

em.remove(info);

em.getTransaction().commit();

} finally {

em.close();

}

}

 

/**

* 修改用户id=6的数据

*/

public static void update() {

final EntityManagerFactory emf = Persistence.createEntityManagerFactory("piscesPU");

final EntityManager em = emf.createEntityManager();

// 找不到数据的话这里会抛异常

UserInfo info = em.find(UserInfo.class, 6);

info.setUserName("哈哈");

info.getAddress().setStreet("坂田2");

try {

em.getTransaction().begin();

// 自动将info更新到数据库

em.getTransaction().commit();

} finally {

em.close();

}

}

 

/**

* 查询所有用户数据

*/

public static void query() {

final EntityManagerFactory emf = Persistence.createEntityManagerFactory("piscesPU");

long s = System.currentTimeMillis();

// 数据库连接失败这里会抛出异常

final EntityManager em = emf.createEntityManager();

long e = System.currentTimeMillis();

System.out.println("连接数据库耗时: " + (e - s) + "毫秒");

// 获取数据

@SuppressWarnings("unchecked")

List<UserInfo> list = em.createQuery("SELECT a FROM UserInfo a").getResultList();

int i = 0;

for (UserInfo info : list) {

System.out.println("第" + (++i) + "个值为: " + info);

}

em.close();

}

 

/**

* 创建用户id=6的一条数据, 地址id=6

*/

public static void create() {

final EntityManagerFactory emf = Persistence.createEntityManagerFactory("piscesPU");

final EntityManager em = emf.createEntityManager();

 

UserInfo info = new UserInfo(6);

info.setSex("male");

info.setUserName("张某某");

info.setBirthday(new java.sql.Timestamp(System.currentTimeMillis()));

Address naddr = new Address(6);

naddr.setCity("深圳");

naddr.setStreet("坂田");

naddr.setZip("518000");

info.setAddress(naddr);

 

try {

em.getTransaction().begin();

em.persist(info);

em.getTransaction().commit();

} finally {

em.close();

}

}

 

/**

* 主函数

*/

public static void main(String[] args) throws Throwable {

SimpleService.query();

SimpleService.create();

System.out.println("新增一条数据后进行查询");

SimpleService.query();

SimpleService.update();

System.out.println("修改一条数据后进行查询");

SimpleService.query();

SimpleService.delete();

System.out.println("删除一条数据后进行查询");

SimpleService.query();

}

}

运行结果

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

[TopLink Info]: 2014.11.20 08:24:08.134--ServerSession(1112823384)--TopLink, version: Oracle TopLink Essentials - 2.1 (Build 60f (01/07/2009))

[TopLink Info]: 2014.11.20 08:24:08.822--ServerSession(1112823384)--file:/E:/E_441_64/workspace/jpa-demo/target/classes/-piscesPU login successful

连接数据库耗时: 1264毫秒

1个值为: UserInfo[userid=1, userName='张金雄', sex='male', birthday=null, address=Address[addressid=1, city='深圳', street='坂田市场', zip='518001

2个值为: UserInfo[userid=2, userName='李某某', sex='male', birthday=null, address=Address[addressid=2, city='深圳', street='坂田路口', zip='518002

3个值为: UserInfo[userid=3, userName='王某某', sex='female', birthday=2006-08-10 00:00:00.0, address=Address[addressid=3, city='深圳', street='四季花城', zip='518003

4个值为: UserInfo[userid=4, userName='陈某某', sex='male', birthday=2006-08-12 00:00:00.0, address=Address[addressid=3, city='深圳', street='四季花城', zip='518003

新增一条数据后进行查询

连接数据库耗时: 0毫秒

1个值为: UserInfo[userid=1, userName='张金雄', sex='male', birthday=null, address=Address[addressid=1, city='深圳', street='坂田市场', zip='518001

2个值为: UserInfo[userid=2, userName='李某某', sex='male', birthday=null, address=Address[addressid=2, city='深圳', street='坂田路口', zip='518002

3个值为: UserInfo[userid=3, userName='王某某', sex='female', birthday=2006-08-10 00:00:00.0, address=Address[addressid=3, city='深圳', street='四季花城', zip='518003

4个值为: UserInfo[userid=4, userName='陈某某', sex='male', birthday=2006-08-12 00:00:00.0, address=Address[addressid=3, city='深圳', street='四季花城', zip='518003

5个值为: UserInfo[userid=6, userName='张某某', sex='male', birthday=2014-11-20 20:24:09.102, address=Address[addressid=6, city='深圳', street='坂田', zip='518000

修改一条数据后进行查询

连接数据库耗时: 0毫秒

1个值为: UserInfo[userid=1, userName='张金雄', sex='male', birthday=null, address=Address[addressid=1, city='深圳', street='坂田市场', zip='518001

2个值为: UserInfo[userid=2, userName='李某某', sex='male', birthday=null, address=Address[addressid=2, city='深圳', street='坂田路口', zip='518002

3个值为: UserInfo[userid=3, userName='王某某', sex='female', birthday=2006-08-10 00:00:00.0, address=Address[addressid=3, city='深圳', street='四季花城', zip='518003

4个值为: UserInfo[userid=4, userName='陈某某', sex='male', birthday=2006-08-12 00:00:00.0, address=Address[addressid=3, city='深圳', street='四季花城', zip='518003

5个值为: UserInfo[userid=6, userName='哈哈', sex='male', birthday=2014-11-20 20:24:09.102, address=Address[addressid=6, city='深圳', street='坂田2', zip='518000

删除一条数据后进行查询

连接数据库耗时: 0毫秒

1个值为: UserInfo[userid=1, userName='张金雄', sex='male', birthday=null, address=Address[addressid=1, city='深圳', street='坂田市场', zip='518001

2个值为: UserInfo[userid=2, userName='李某某', sex='male', birthday=null, address=Address[addressid=2, city='深圳', street='坂田路口', zip='518002

3个值为: UserInfo[userid=3, userName='王某某', sex='female', birthday=2006-08-10 00:00:00.0, address=Address[addressid=3, city='深圳', street='四季花城', zip='518003

4个值为: UserInfo[userid=4, userName='陈某某', sex='male', birthday=2006-08-12 00:00:00.0, address=Address[addressid=3, city='深圳', street='四季花城', zip='518003

完整工程源代码

下载地址:http://download.csdn.net/detail/xuxiheng/8181849

参考文档

  1. 在Java SE环境下使用JPA1.0(1)
  2. Toplink JPA简介

http://www.cnblogs.com/ctoroad/p/4111447.html

 

时间: 2024-08-04 12:32:05

Maven 版 JPA 最佳实践(转)的相关文章

《UNIX/Linux 系统管理技术手册(第四版)》——2.6 脚本编程的最佳实践

2.6 脚本编程的最佳实践 UNIX/Linux 系统管理技术手册(第四版) 虽然本章里的代码片段几乎不带注释,而且很少打印用法说明,只是因为我们已经列出了每个例子的大纲,从而体现出若干关键点.实际的脚本应该有更好的表现.有几本书通篇就讲编码的最佳实践,不过其中的基本指导原则如下. 如果运行脚本时带了不合适的参数,脚本应该打印一则用法说明,然后再退出.更好的做法是,也以这样的方式实现--help选项. 验证输入的有效性,并检查获得的输入值.例如,在对算出来的一个路径执行rm -fr操作之前,可能

微信公众平台开发最佳实践(第2版)

  <微信公众平台开发最佳实践 第2版>微信公众平台开发经典之作全新改版,精心挑选最经典的商业项目开发,成千上万人次微信公众平台开发者从中受益 方倍工作室已出版本书的第3版电子版,内容更多,价格更优惠,欢迎查看购买,地址:http://www.cnblogs.com/txw1958/p/buy-ebook.html       前言 出版说明 自从方倍工作室在博客园推出微信公众平台开发系列教程后,受到广大微信开发人员及爱好者的热情关注,相关文章的日访问量高达2万人次,而<微信公众平台开发

OSGi原理与最佳实践(精选版)中第二个例子 找不到org.mortbay.jetty 这个Bundle 求解决办法??

问题描述 OSGi原理与最佳实践(精选版)中第二个例子找不到org.mortbay.jetty这个Bundle求解决办法?? 解决方案 解决方案二:看下下面帖子配置http://blog.sina.com.cn/s/blog_9671d5180101r5dg.html

Maven实战. 2.7Maven安装最佳实践

2.7Maven安装最佳实践本节介绍一些在安装Maven过程中不是必须的,但十分有用的实践.2.7.1设置MAVEN_OPTS环境变量前面介绍Maven安装目录时我们了解到,运行mvn命令实际上是执行了Java命令,既然是运行Java,那么运行Java命令可用的参数当然也应该在运行mvn命令时可用.这个时候,MAVEN_OPTS环境变量就能派上用场.通常需要设置MAVEN_OPTS的值为-Xms128m -Xmx512m,因为Java默认的最大可用内存往往不能够满足Maven运行的需要,比如在项

《社交网站界面设计(原书第2版)》——1.5 实践(或最佳实践):做事的习惯性行为或方式

1.5 实践(或最佳实践):做事的习惯性行为或方式 最佳实践很有意思,常常与原则或交互模式相混淆.它们是连续的统一体,并且比交互模式方案的规定更少--至少在我们的定义中是这样的.我们常常会在交互模式中提供最佳实践. 例如:在移动背景中,为触摸进行设计.确保按钮.表单和其他元素足够大,让用户可以与它们交互,并且可以容纳人的手指,以免不小心触发相邻的元素. 最佳实践有助于澄清如何应用一个具体设计方案,而且它通常也是最有效.高效地解决问题的方式,虽然它并不一定是唯一的处理方式.

JavaScript DOM 编程艺术(第2版)读书笔记(JavaScript的最佳实践)_javascript技巧

1.防止滥用JavaScript"不管你想通过JavaScript改变哪个网页的行为,都必须三思而后行.首先要确认:为这个网页增加这种额外的行为是否确有必要?" 个人认为,作者的这句话放在当前几乎无处不用JavaScript来增强Web页面交互体验的时代,可以理解为应该适当的使用JavaScript,而不要因为使用了实现酷炫效果的脚本导致网页加载缓慢或者兼容性极差而舍本求末,导致用户无法浏览和使用网站. 2.平稳退化平稳退化是指当用户禁用浏览器JavaScript或浏览器不支持Java

《社交网站界面设计(原书第2版)》——1.3 所谓的原则、最佳实践和模式是什么

1.3 所谓的原则.最佳实践和模式是什么 随着人们对无缝式体验的期待越来越强烈,对设计师来说重要的是关注新出现的标准并理解某个产品的体验及其交互如何影响用户对下一个产品的期望.通过使用标准的.新出现的最佳实践.原则和交互模式,设计师就可以减少用户在理解该应用如何运行方面所需精力.然后,用户就可以关注正在构建的社交体验的独特性能.为了顺利开展工作,我们定义了如下三个不同的概念.它们是连续的统一体,从规定(你应该遵守的规则)到假设(默认为正确的一种基本状态)再到处理方式(思考对待这些概念的方式).

Jenkins管道最佳实践Top 10

本文讲的是Jenkins管道最佳实践Top 10[编者的话]Andy Pemberton领导CloudBees的解决方案架构团队.CloudBees是一家依赖Jenkins实现云化持续集成平台的创业公司,目前已经得到C轮融资.Andy拥有超过十年的软件交付经验,同时他也是经常发表演讲和撰写博客.本文是Andy做为Jenkins专家给出的10条Jenkins管道化使用的最佳实践. Jenkins的管道化插件对于其用户来说是个变局者.依赖于域领域语言(DSL)Groovy,管道化插件实现了脚本化.这

Android应用性能优化最佳实践.

移动开发 Android应用性能优化最佳实践 罗彧成 著 图书在版编目(CIP)数据 Android应用性能优化最佳实践 / 罗彧成著. -北京:机械工业出版社,2017.1 (移动开发) ISBN 978-7-111-55616-9 I. A- II. 罗- III. 移动终端-应用程序-程序设计 IV. TN929.53 中国版本图书馆CIP数据核字(2016)第315986号 Android应用性能优化最佳实践 出版发行:机械工业出版社(北京市西城区百万庄大街22号 邮政编码:100037