- 浏览: 236254 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
akka_li:
学习了!但是为什么后续的没有了?!
EJB4:RMI和RMI-IIOP -
springaop_springmvc:
apache lucene开源框架demo使用实例教程源代码下 ...
Lucene学习笔记(一)Lucene入门实例 -
qepipnu:
求solr 客户端 jar包
Solr学习笔记(三)Solr客户端开发实例 -
zhangbc:
是这问题,赞!
Oracle Start Up 2 Oracle 框架构件、启动、解决一个问题 -
feilian09:
查询 select hibernate jdbc 那个效率快
Hibernate,JDBC性能探讨
最近工作中遇到几个与JPA相关的问题,本文通过一个例子总结一下这些问题。
1 给出一个例子:
如下图表式Persistent Context中所有实体的关系图:
从图中可以看到:
所有实体间对应关系都是单向的;
User和Event,User和Friend,Event和Property,Wife和Pet,Pet和Property关系为一对多关系;
User和UserCard,Friend和UserCard,Wife和UserCard,User和Wife之间的关系是一对一关系;
如http://kylinsoong.iteye.com/blog/807937所示创建工程;
贴出相关代码:
package com.tibco.hibernate.po; import java.util.Calendar; import java.util.List; import java.util.Set; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.JoinTable; import javax.persistence.OneToMany; import javax.persistence.OneToOne; import javax.persistence.Table; import javax.persistence.Temporal; import javax.persistence.TemporalType; import org.hibernate.annotations.Cascade; import org.hibernate.annotations.ForeignKey; @Entity(name="User") @Table(name="k_user") public class User { private Long id; private String name; private List<Event> events; private List<Friend> friends; private UserCard userCard; private Wife wife; private Calendar createdDate; private Boolean isMale; @Column @Id @GeneratedValue public Long getId() { return id; } public void setId(Long id) { this.id = id; } @Column public String getName() { return name; } public void setName(String name) { this.name = name; } @OneToMany ( targetEntity=com.tibco.hibernate.po.Event.class, fetch=FetchType.LAZY, cascade = { CascadeType.ALL }) @Cascade( { org.hibernate.annotations.CascadeType.ALL } ) @JoinTable(name="k_user_event", joinColumns = @JoinColumn(name = "USER_ID"), inverseJoinColumns = @JoinColumn(name = "EVENT_ID")) @ForeignKey(name = "k_user_event_FK", inverseName = "k_user_event_FK_R") public List<Event> getEvents() { return events; } public void setEvents(List<Event> events) { this.events = events; } @OneToMany ( targetEntity=com.tibco.hibernate.po.Friend.class, fetch=FetchType.EAGER, cascade = { CascadeType.ALL }) @Cascade( { org.hibernate.annotations.CascadeType.ALL } ) @JoinTable(name="k_user_friend", joinColumns = @JoinColumn(name = "USER_ID"), inverseJoinColumns = @JoinColumn(name = "FRIEND_ID")) @ForeignKey(name = "k_user_friend_FK", inverseName = "k_user_friend_FK_R") public List<Friend> getFriends() { return friends; } public void setFriends(List<Friend> friends) { this.friends = friends; } @OneToOne( targetEntity = com.tibco.hibernate.po.UserCard.class, fetch = FetchType.EAGER, cascade = { CascadeType.ALL }) @Cascade( { org.hibernate.annotations.CascadeType.ALL } ) @JoinColumn(name = "UserCard_id") @ForeignKey(name = "USER_TO_USERCARD_FK") public UserCard getUserCard() { return userCard; } public void setUserCard(UserCard userCard) { this.userCard = userCard; } @OneToOne( targetEntity = com.tibco.hibernate.po.Wife.class, fetch = FetchType.EAGER, cascade = { CascadeType.ALL }) @Cascade( { org.hibernate.annotations.CascadeType.ALL } ) @JoinColumn(name = "Wife_id") @ForeignKey(name = "USER_TO_WIFE_FK") public Wife getWife() { return wife; } public void setWife(Wife wife) { this.wife = wife; } @Column(name = "CREATEDDATE") @Temporal(TemporalType.DATE) public Calendar getCreatedDate() { return createdDate; } public void setCreatedDate(Calendar createdDate) { this.createdDate = createdDate; } @Column public Boolean getIsMale() { return isMale; } public void setIsMale(Boolean isMale) { this.isMale = isMale; } }
package com.tibco.hibernate.po; import java.util.List; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.JoinTable; import javax.persistence.OneToMany; import javax.persistence.Table; import org.hibernate.annotations.Cascade; import org.hibernate.annotations.ForeignKey; @Entity(name="Event") @Table(name="k_event") public class Event { private Long id; private String name; private List<Property> properties; @Column @Id @GeneratedValue public Long getId() { return id; } public void setId(Long id) { this.id = id; } @Column public String getName() { return name; } public void setName(String name) { this.name = name; } @OneToMany ( targetEntity=com.tibco.hibernate.po.Property.class, fetch=FetchType.LAZY, cascade = { CascadeType.ALL }) @Cascade( { org.hibernate.annotations.CascadeType.ALL } ) @JoinTable(name="k_event_property", joinColumns = @JoinColumn(name = "EVENT_ID"), inverseJoinColumns = @JoinColumn(name = "PROPERTY_ID")) @ForeignKey(name = "k_event_property_FK", inverseName = "k_event_property_FK_R") public List<Property> getProperties() { return properties; } public void setProperties(List<Property> properties) { this.properties = properties; } }
package com.tibco.hibernate.po; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Table; @Entity(name="Property") @Table(name="k_property") public class Property { private Long id; private String name; @Column @Id @GeneratedValue public Long getId() { return id; } public void setId(Long id) { this.id = id; } @Column public String getName() { return name; } public void setName(String name) { this.name = name; } public String toString() { return "Property [id=" + id + ", name=" + name + "]"; } }
package com.tibco.hibernate.po; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.OneToOne; import javax.persistence.Table; import org.hibernate.annotations.Cascade; import org.hibernate.annotations.ForeignKey; @Entity(name="Friend") @Table(name="k_friend") public class Friend { private Long id; private String name; private UserCard userCard; @Column @Id @GeneratedValue public Long getId() { return id; } public void setId(Long id) { this.id = id; } @Column public String getName() { return name; } public void setName(String name) { this.name = name; } @OneToOne( targetEntity = com.tibco.hibernate.po.UserCard.class, fetch = FetchType.EAGER, cascade = { CascadeType.ALL }) @Cascade( { org.hibernate.annotations.CascadeType.ALL } ) @JoinColumn(name = "UserCard_id") @ForeignKey(name = "FRIEND_TO_USERCARD_FK") public UserCard getUserCard() { return userCard; } public void setUserCard(UserCard userCard) { this.userCard = userCard; } public String toString() { return "Friend [id=" + id + ", name=" + name + "]"; } }
package com.tibco.hibernate.po; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Table; @Entity(name="UserCard") @Table(name="k_userCard") public class UserCard { private Long id; private String cardNumber; @Column @Id @GeneratedValue public Long getId() { return id; } public void setId(Long id) { this.id = id; } @Column public String getCardNumber() { return cardNumber; } public void setCardNumber(String cardNumber) { this.cardNumber = cardNumber; } }
package com.tibco.hibernate.po; import java.util.List; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.JoinTable; import javax.persistence.OneToMany; import javax.persistence.OneToOne; import javax.persistence.Table; import org.hibernate.annotations.Cascade; import org.hibernate.annotations.ForeignKey; @Entity(name="Wife") @Table(name="k_wife") public class Wife { private Long id; private String name; private UserCard userCard; private List<Pet> pets; @Column @Id @GeneratedValue public Long getId() { return id; } public void setId(Long id) { this.id = id; } @Column public String getName() { return name; } public void setName(String name) { this.name = name; } @OneToOne( targetEntity = com.tibco.hibernate.po.UserCard.class, fetch = FetchType.EAGER, cascade = { CascadeType.ALL }) @Cascade( { org.hibernate.annotations.CascadeType.ALL } ) @JoinColumn(name = "UserCard_id") @ForeignKey(name = "Wife_TO_USERCARD_FK") public UserCard getUserCard() { return userCard; } public void setUserCard(UserCard userCard) { this.userCard = userCard; } @OneToMany ( targetEntity=com.tibco.hibernate.po.Pet.class, fetch=FetchType.LAZY, cascade = { CascadeType.ALL }) @Cascade( { org.hibernate.annotations.CascadeType.ALL } ) @JoinTable(name="k_wife_pet", joinColumns = @JoinColumn(name = "WIFE_ID"), inverseJoinColumns = @JoinColumn(name = "PET_ID")) @ForeignKey(name = "k_wife_pet_FK", inverseName = "k_wife_pet_FK_R") public List<Pet> getPets() { return pets; } public void setPets(List<Pet> pets) { this.pets = pets; } }
package com.tibco.hibernate.po; import java.util.List; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.JoinTable; import javax.persistence.OneToMany; import javax.persistence.Table; import org.hibernate.annotations.Cascade; import org.hibernate.annotations.ForeignKey; @Entity(name="Pet") @Table(name="k_pet") public class Pet { private Long id; private String name; private List<Property> properties; @Column @Id @GeneratedValue public Long getId() { return id; } public void setId(Long id) { this.id = id; } @Column public String getName() { return name; } public void setName(String name) { this.name = name; } @OneToMany ( targetEntity=com.tibco.hibernate.po.Property.class, fetch=FetchType.LAZY, cascade = { CascadeType.ALL }) @Cascade( { org.hibernate.annotations.CascadeType.ALL } ) @JoinTable(name="k_pet_property", joinColumns = @JoinColumn(name = "EVENT_ID"), inverseJoinColumns = @JoinColumn(name = "PROPERTY_ID")) @ForeignKey(name = "k_pet_property_FK", inverseName = "k_pet_property_FK_R") public List<Property> getProperties() { return properties; } public void setProperties(List<Property> properties) { this.properties = properties; } }
贴出persistence.xml配置:
<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="com.tibco.hibernate.po"> <provider>org.hibernate.ejb.HibernatePersistence</provider> <class>com.tibco.hibernate.po.Event</class> <class>com.tibco.hibernate.po.Friend</class> <class>com.tibco.hibernate.po.Pet</class> <class>com.tibco.hibernate.po.Property</class> <class>com.tibco.hibernate.po.User</class> <class>com.tibco.hibernate.po.UserCard</class> <class>com.tibco.hibernate.po.Wife</class> <properties> </properties> </persistence-unit> </persistence>
数据库配置信息:
hibernate.dialect=org.hibernate.dialect.Oracle10gDialect #connection hibernate.connection.driver_class=oracle.jdbc.driver.OracleDriver hibernate.connection.username=IPC113 hibernate.connection.password=bpm hibernate.connection.url=jdbc:oracle:thin:@//192.168.68.120:1521/orcl #pool hibernate.c3p0.min_size=1 hibernate.c3p0.max_size=20 hibernate.c3p0.timeout=1800 hibernate.c3p0.max_statements=50
在J2SE下使用JPA需要EntityManager对Persistent context中的实体与数据库同步,EntityManager由EntityManagerFactory产生,给出产生EntityManagerFactory的工具类:
package com.tibco.hibernate.jpa; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.Properties; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; public class JPAUtil { public static final String POJO_PACKAGE = "com.tibco.hibernate.po"; public static EntityManagerFactory createEMF(String dbproperties) throws IOException { Properties persistenceProperties = loadProperties(dbproperties); return Persistence.createEntityManagerFactory(POJO_PACKAGE, persistenceProperties); } public static Properties loadProperties(String dbproperties) throws IOException { Properties persistenceProperties = loadFromResource(dbproperties+".properties"); return persistenceProperties; } private static Properties loadFromResource(String resourceName) throws IOException { Properties p = new Properties(); InputStream is = new FileInputStream(new File(resourceName)); try { p.load(is); } finally { try { if (is != null) is.close(); } catch (IOException ignored) { } } return p; } }
先在向数据库中插入一条数据:
public class JPAClient { public static void main(String[] args) throws Throwable { EntityManagerFactory emf = JPAUtil.createEMF("oracle"); EntityManager em = emf.createEntityManager(); EntityTransaction t = em.getTransaction(); t.begin(); User user = getUser(); em.persist(user); t.commit(); em.close(); emf.close(); } private static boolean isProxyProperty(Object obj) throws Throwable { String name = obj.getClass().getName(); return name.contains("_$$_javassist_") || name.contains("org.hibernate.collection.PersistentBag"); } private static User getUser() { List<Event> events = getEventList(); List<Friend> friends = getFriendList(); UserCard userCard = new UserCard(); userCard.setCardNumber("user usercard number"); Wife wife = getWife(); User user = new User(); user.setName("Kylin Soong"); user.setEvents(events); user.setEvents(events); user.setFriends(friends); user.setIsMale(Boolean.TRUE); user.setUserCard(userCard); user.setCreatedDate(Calendar.getInstance()); user.setWife(wife); return user; } private static Wife getWife() { UserCard userCard = new UserCard(); userCard.setCardNumber("Wife usercard number"); List<Pet> pets = getPetList(); Wife wife = new Wife(); wife.setName("Bitch Soong"); wife.setUserCard(userCard); wife.setPets(pets); return wife; } private static List<Pet> getPetList() { List<Pet> pets = new ArrayList<Pet>(); Pet p1 = new Pet(); p1.setName("dog 1"); p1.setProperties(getPropertyList(p1.getName())); Pet p2 = new Pet(); p2.setName("dog 2"); p2.setProperties(getPropertyList(p2.getName())); pets.add(p2); pets.add(p1); return pets; } private static List<Friend> getFriendList() { List<Friend> friends = new ArrayList<Friend>(); Friend f1 = new Friend(); f1.setName("friend1"); UserCard uc1 = new UserCard(); uc1.setCardNumber("friend1-usercard-number"); f1.setUserCard(uc1); Friend f2 = new Friend(); f2.setName("friend2"); UserCard uc2 = new UserCard(); uc2.setCardNumber("friend2-usercard-number"); f2.setUserCard(uc2); friends.add(f1); friends.add(f2); return friends; } private static List<Event> getEventList() { List<Event> events = new ArrayList<Event>(); Event e = null; e = new Event(); e.setName("Cool"); e.setProperties(getPropertyList(e.getName())); events.add(e); e = new Event(); e.setName("Hot"); e.setProperties(getPropertyList(e.getName())); events.add(e); e = new Event(); e.setName("Cold"); e.setProperties(getPropertyList(e.getName())); events.add(e); return events; } private static List<Property> getPropertyList(String name) { List<Property> props = new ArrayList<Property>(); Property p1 = new Property(); p1.setName(name + " property 1"); Property p2 = new Property(); p2.setName(name + " property 2"); props.add(p1); props.add(p2); return props; } }
这时一条数据插入到数据库,
到此词例子结束,接下来的一些测试全基于此例子
发表评论
-
Oracle - Add Exist Validation Before Create Table
2011-11-07 13:49 1405Usually we need to check the ta ... -
JMX Architecture & "Hello Word" the JMX way
2011-10-25 20:07 1748JMX Architecture Overview: JMX ... -
Jboss-eap-5.1 Messaging
2011-08-02 21:50 2403This section I will concertate ... -
Jboss-eap-5.1 starting up note
2011-07-26 22:46 2545Jboss enterprise platform 5 hav ... -
EJB Security & JAAS Demo
2011-05-21 19:39 1577PROLOGUE: When deploying ... -
JBoss LoginInitialContext Factory Implementation
2011-05-15 16:05 1466Jboss has a series of imp ... -
Jboss Reference Exception Gallery
2011-04-27 14:08 28521. Unable to locate a login con ... -
Hibernate Annotation 的一个问题,给点意见
2011-03-10 12:43 22问题:org.hibernate.annotations. ... -
大家说说BBC的网站用的是什么技术做的
2011-02-22 05:01 1395最近在英国出差,发现这里的一些网站做的相当有特色,有些网站不是 ... -
Hibernate OneToMany 单向和双向配置对数据存取性能的比较
2011-02-08 17:06 22441. 开篇说明:今天是春 ... -
对Hibernate属性(CascadeType、JoinColumn、JoinTable、ForeignKey等)的研究
2010-12-26 15:45 16605本文列出几个“EJB 学习阶段总结:JBoss下发布一个Toy ... -
EJB 学习阶段总结:JBoss下发布一个Toy企业应用
2010-12-25 12:11 2549解释题目:为什 ... -
EJB7: Message Driven Bean
2010-12-21 22:42 2099在企业系统中需要使用 ... -
EJB6: EntityBean例子
2010-11-26 14:48 1442本例子描述向EJB容器(JBoss)部署http: ... -
JPA dev: 几个问题总结(续)
2010-11-25 18:02 24052. 如何由PoJo类生成数据库中的表 首先可以根据实体间关 ... -
JAXB学习
2010-11-24 22:35 01 什么是JAXB? JAXB全称Java Ar ... -
EJB5: JPA扩展-J2SE环境下使用EntityManager
2010-11-10 19:07 2643好久没有写博客了,最近比较忙,今天抽时间写点,最近 ... -
EJB4:RMI和RMI-IIOP
2010-11-02 21:14 4069计划提纲:引入→RMI概念→RMI HelloWorld程序→ ... -
EJB3: JBOSS 企业版、JBOSS服务器构架、EJB2.0 HelloWrold实例
2010-10-26 22:43 6415本文的研究基于jboss-eap- ... -
jboss-eap-4.3 启动停止在Configuring from URL: resource:jboss-log4j.xml 问题
2010-10-25 14:49 4009如题,我改用jboss-eap-4.3, 启动时停止在Conf ...
相关推荐
eladmin jpa版本:前端源码,项目基于 Spring Boot 2.1.0 、 Spring Boot Jp
管理系统系列--eladmin jpa 版本:项目基于 Spring Boot 2.6.4、 Jpa、 Spring
用SpringBoot + Spring Data JPA操作数据库 项目启动的时候 报了一个错 SpringBoot的版本是2.2.6.RELEASE org.springframework.beans.factory.BeanCreationException: Error creating bean with name '...
NULL 博文链接:https://wsc830719.iteye.com/blog/517167
Maven坐标:org.springframework.data:spring-data-jpa:2.0.9.RELEASE; 标签:springframework、data、spring、jpa、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,...
JpaRepository:belajar menggunakan JPA存储库
JPA研究:有关JPA的一些测试和研究
JPA Console是一个Eclipse插件,它允许执行JPQL和Criteria的JPA查询。
Jpa.doc
第一章:Spring Data JPA入门 包括:是什么、能干什么、有什么、HelloWorld等 第二章:JpaRepository基本功能 包括:代码示例JpaRepository提供的CRUD功能,还有翻页、排序等功能 第三章:JpaRepository的查询 ...
jpa入门案例:单表查询,包括分页查询 使用springboot来整合实现
1:JPA: : 2:对象数据库: ://www.objectdb.com/ 3:JPA 性能基准: ://www.jpab.org/All/All/All.html 支持功能 支持所有蓝图功能, 除外 支撑 支持 支持 Java 5、6 或 7 支持 JPA 你需要哪一个取决于你想用...
Apress Pro JPA2 Mastering the Java Persistence API
spring-data-jpa知识。
JPA示例 样例Spring Boot API服务器 依存关系 SpringData JPA 弹簧靴 LomBook Spring网 H2数据库 Spring安全
这是JPA网站的全部源代码,可以用作示例代码来确定我们处理项目的方式。 我们工作的所有网站都具有相同的质量,由于它们的特殊用法,可能或多或少配备了这些设备。 每个人都可以使用此源代码来限定我们的代码或用于...
JPA核心知识总结 详解 spring JPA
JPA规范实现,用JPA来解决可移植问题
JPA模块:PED Central是开源``Justify''软件工程模块套件的所在地。 Justify寻求Java 1.8+应用程序代码与JUnit 5测试代码之间的API对齐。 发行说明 版本8.5.0- alpha5 2018-05-02 28岁 版本8.5.0-alpha4 2018-04-19 ...