当前位置: 首页 > news >正文

筹备网站建设湖南做网站磐石网络

筹备网站建设,湖南做网站磐石网络,智慧校园学生管理系统,怎么推广店铺hibernate jpa这是关于使用Hibernate和JPA的教程的第一部分。 这部分是对JPA和Hibernate的介绍。 第二部分将研究使用Spring ORM组合一个Spring MVC应用程序#xff0c;以减少创建CRUD应用程序所需的代码量。 要完成此操作#xff0c;您需要熟悉Maven#xff0c;JUnit#… hibernate jpa 这是关于使用Hibernate和JPA的教程的第一部分。 这部分是对JPA和Hibernate的介绍。 第二部分将研究使用Spring ORM组合一个Spring MVC应用程序以减少创建CRUD应用程序所需的代码量。 要完成此操作您需要熟悉MavenJUnitSQL和关系数据库。 依存关系 首先我们需要几个基本的依赖关系。 本质上分为三层 最低层是Hibernate用于连接数据库的JDBC驱动程序。 我将使用一个简单的嵌入式数据库Derby。 没有要安装或配置的服务器因此即使是MySQL或PostgreSQL其设置也更容易。 它不适合生产。 中间层是Hibernate库。 我将使用3.5.6版。 这适用于Java 1.5但不适用于4.x。 JPA库。 另外我们希望JUnit可以创建测试和Tomcat因此我们可以将其JNDI命名用于测试。 出于我们将要提到的原因JNDI是将服务器详细信息包含在属性文件中的首选系统。 dependenciesdependencygroupIdorg.apache.derby/groupIdartifactIdderby/artifactIdversion10.4.1.3/version/dependencydependencygroupIdorg.hibernate/groupIdartifactIdhibernate-entitymanager/artifactIdversion3.6.9.Final/version/dependencydependencygroupIdorg.hibernate.javax.persistence/groupIdartifactIdhibernate-jpa-2.0-api/artifactIdversion1.0.0.Final/version/dependencydependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion4.10/versionscopetest/scope/dependencydependencygroupIdorg.apache.tomcat/groupIdartifactIdcatalina/artifactIdversion6.0.18/versionscopetest/scope/dependency/dependencies 组态 JPA的关键配置文件是persistence.xml。 这位于META-INF目录中。 它详细说明了要使用的持久性驱动程序以及要连接的JNDI数据源。 还可以指定其他属性在这种情况下我们将包括一些Hibernate属性。 我在其他属性上添加了一些注释以便您了解它们的用途。 您可以直接配置数据源但是使用JNDI意味着我们可以以最小的代码更改轻松地将代码作为独立的代码运行在容器中或运行单元测试。 ?xml version1.0 encodingUTF-8? persistence xmlnshttp://java.sun.com/xml/ns/persistencexmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsdversion1.0persistence-unit nametutorialPU transaction-typeRESOURCE_LOCALproviderorg.hibernate.ejb.HibernatePersistence/provider!-- the JNDI data source --non-jta-data-sourcejava:comp/env/jdbc/tutorialDS/non-jta-data-sourceproperties!-- if this is true, hibernate will print (to stdout) the SQL it executes, so you can check it to ensure its not doing anything crazy --property namehibernate.show_sql valuetrue /property namehibernate.format_sql valuetrue /!-- since most database servers have slightly different versions of the SQL, Hibernate needs you to choose a dialect so it knows the subtleties of talking to that server --property namehibernate.dialect valueorg.hibernate.dialect.DerbyDialect /!-- this tell Hibernate to update the DDL when it starts, very useful for development, dangerous in production --property namehibernate.hbm2ddl.auto valueupdate //properties/persistence-unit /persistence 实体 JPA谈论实体而不是数据库记录。 实体是类的实例映射到表中的单个记录类映射到表。 实体字段应使用JavaBean命名约定被映射到列。 注释可用于向类添加额外的信息。 它们将类标记为实体并允许您指定有关表和列的元信息例如名称大小和约束。 在我们的例子中我们将从最简单的实体开始。 package tutorial;import javax.persistence.*; import java.util.HashSet; import java.util.Set;Entity Table(name usr) // Table is optional, but user is a keyword in many SQL variants public class User {Id // Id indicates that this it a unique primary keyGeneratedValue // GeneratedValue indicates that value is automatically generated by the serverprivate Long id;Column(length 32, unique true)// the optional Column allows us makes sure that the name is limited to a suitable size and is uniqueprivate String name;// note that no setter for ID is provided, Hibernate will generate the ID for uspublic long getId() {return id;}public void setName(String name) {this.name name;}public String getName() {return name;} } JPA可以在启动时使用元信息来创建DDL。 这对开发很有帮助因为它使您可以快速启动并运行而无需研究创建表所需SQL。 要添加一列吗 只需添加该列编译并运行即可。 不幸的是您获得的便利还增加了风险例如当一个表具有数百万条记录并且您添加了新列时数据库服务器会做什么和失去控制。 这是一个折衷一旦由Hibernate创建了实体就可以导出DDL并更改Hibernate的配置以停止其更新DDL。 测试用例 只有两部分首先我们将创建一个抽象测试用例作为所有测试的根。 这将在JNDI中注册数据源并且我们将使用其他测试来扩展它以便他们访问数据库。 package tutorial;import org.apache.derby.jdbc.EmbeddedDataSource; import org.apache.naming.java.javaURLContextFactory; import org.junit.AfterClass; import org.junit.BeforeClass;import javax.naming.Context; import javax.naming.InitialContext;public abstract class AbstractTest {BeforeClasspublic static void setUpClass() throws Exception {System.setProperty(Context.INITIAL_CONTEXT_FACTORY, javaURLContextFactory.class.getName());System.setProperty(Context.URL_PKG_PREFIXES, org.apache.naming);InitialContext ic new InitialContext();ic.createSubcontext(java:);ic.createSubcontext(java:comp);ic.createSubcontext(java:comp/env);ic.createSubcontext(java:comp/env/jdbc);EmbeddedDataSource ds new EmbeddedDataSource();ds.setDatabaseName(tutorialDB);// tell Derby to create the database if it does not already existds.setCreateDatabase(create);ic.bind(java:comp/env/jdbc/tutorialDS, ds);}AfterClasspublic static void tearDownClass() throws Exception {InitialContext ic new InitialContext();ic.unbind(java:comp/env/jdbc/tutorialDS);} } 最后一块是测试用例。 实体管理器提供对数据的访问。 持久操作在这种情况下将导致单次插入必须在事务中执行。 实际上在提交之前Hibernate不会做任何工作。 您可以通过在提交之前立即添加Thread.sleep来查看此信息。 Testpublic void testNewUser() {EntityManager entityManager Persistence.createEntityManagerFactory(tutorialPU).createEntityManager();entityManager.getTransaction().begin();User user new User();user.setName(Long.toString(new Date().getTime()));entityManager.persist(user);entityManager.getTransaction().commit();// see that the ID of the user was set by HibernateSystem.out.println(user user , user.id user.getId());User foundUser entityManager.find(User.class, user.getId());// note that foundUser is the same instance as user and is a concrete class (not a proxy)System.out.println(foundUser foundUser);assertEquals(user.getName(), foundUser.getName());entityManager.close();} 异常处理 需要开始和提交很冗长。 此外最后一个示例是不完整的因为如果发生异常它将错过任何回滚。 异常处理是样板代码。 就像它的JDBC一样它也不漂亮。 这是一个例子 Test(expected Exception.class)public void testNewUserWithTxn() throws Exception {EntityManager entityManager Persistence.createEntityManagerFactory(tutorialPU).createEntityManager();entityManager.getTransaction().begin();try {User user new User();user.setName(Long.toString(new Date().getTime()));entityManager.persist(user);if (true) {throw new Exception();}entityManager.getTransaction().commit();} catch (Exception e) {entityManager.getTransaction().rollback();throw e;}entityManager.close();} 由于存在更好的方法因此我暂时将异常管理排除在外。 稍后我们将研究JSR-330的Inject和Spring Data的Transactional如何减少样板。 实体关系 由于我们正在使用关系数据库因此几乎可以肯定我们希望在实体之间创建一个关系。 我们将创建一个角色实体并在用户和角色之间建立多对多关系。 要创建角色实体只需复制User实体将其命名为Role并删除Table行。 我们不需要创建UserRole实体。 但是我们将要在用户中添加和删除角色。 将以下字段和方法添加到用户表 ManyToManyprivate SetRole roles new HashSetRole();public boolean addRole(Role role) {return roles.add(role);}public SetRole getRoles() {return roles;} ManyToMany注释告诉JPA这是一个多对多关系。 我们可以用一个新的测试用例进行测试。 该测试在一个事务中创建用户和角色然后在第二个事务中使用合并更新用户。 合并用于更新数据库中的实体。 Testpublic void testNewUserAndAddRole() {EntityManager entityManager Persistence.createEntityManagerFactory(tutorialPU).createEntityManager();entityManager.getTransaction().begin();User user new User();user.setName(Long.toString(new Date().getTime()));Role role new Role();role.setName(Long.toString(new Date().getTime()));entityManager.persist(user);entityManager.persist(role);entityManager.getTransaction().commit();assertEquals(0, user.getRoles().size());entityManager.getTransaction().begin();user.addRole(role);entityManager.merge(user);entityManager.getTransaction().commit();assertEquals(1, user.getRoles().size());entityManager.close();} 查询 JPA允许您使用与SQL非常相似的查询语言JPQL。 查询可以直接编写但是命名查询更易于控制维护和表现更好因为Hibernate可以准备该语句。 使用NamedQuery批注指定它们。 将此行添加到Table注释之后的User类中 NamedQuery(nameUser.findByName, query select u from User u where u.name :name) 您可以如下测试 Testpublic void testFindUser() throws Exception {EntityManager entityManager Persistence.createEntityManagerFactory(tutorialPU).createEntityManager();entityManager.getTransaction().begin();User user new User();String name Long.toString(new Date().getTime());user.setName(name);Role role new Role();role.setName(name);user.addRole(role);entityManager.persist(role);entityManager.persist(user);entityManager.getTransaction().commit();entityManager.close();entityManager Persistence.createEntityManagerFactory(tutorialPU).createEntityManager();User foundUser entityManager.createNamedQuery(User.findByName, User.class).setParameter(name, name).getSingleResult();System.out.println(foundUser);assertEquals(name, foundUser.getName());assertEquals(1, foundUser.getRoles().size());System.out.println(foundUser.getRoles().getClass());entityManager.close();} 在此示例中我关闭并重新打开了实体管理器。 这迫使Hibernate从数据库中请求用户。 注意到关于输出的任何有趣的东西吗 获取角色SQL出现在找到的用户的toString之后。 Hibernate为角色创建了一个代理对象在本例中为org.hibernate.collection.PersistentSet并且仅在您首次访问该对象时填充它。 这可能会导致违反直觉的行为并且有其自身的陷阱。 请尝试上述测试的此变体在我们首先查询角色之前我们关闭实体管理器 Test(expected LazyInitializationException.class)public void testFindUser1() throws Exception {EntityManager entityManager Persistence.createEntityManagerFactory(tutorialPU).createEntityManager();entityManager.getTransaction().begin();User user new User();String name Long.toString(new Date().getTime());user.setName(name);Role role new Role();role.setName(name);user.addRole(role);entityManager.persist(role);entityManager.persist(user);entityManager.getTransaction().commit();entityManager.close();entityManager Persistence.createEntityManagerFactory(tutorialPU).createEntityManager();User foundUser entityManager.createNamedQuery(User.findByName, User.class).setParameter(name, name).getSingleResult();entityManager.close();assertEquals(1, foundUser.getRoles().size());} LazyInitializationException将在getRoles调用上引发。 这不是错误。 实体管理器关闭后任何实体都将无法使用。 结束 这是Hibernate JPA入门和运行的基础。 在本教程的下一部分中我将讨论验证并更深入地探讨其他一些细节。 参考 教程HibernateJPA –来自JCG合作伙伴 Alex Collins的第1部分 位于Alex Collins的博客博客中。 翻译自: https://www.javacodegeeks.com/2012/05/tutorial-hibernate-jpa-part-1.htmlhibernate jpa
http://www.zqtcl.cn/news/366360/

相关文章:

  • 做网站好还是做微信小程序好浙江建设工程造价信息网站
  • 网站开发怎么报价推广普通话手抄报模板可打印
  • 好的平面网站模板企业网站建设浩森宇特
  • 做网站通过什么赚钱吗公司建设网站的费用
  • 如何做建筑一体化的网站视频网站开发应用到哪些技术
  • 巴中微信网站建设竞价托管一般多少钱
  • 彩票网站开发 违法股票网站排名哪个好
  • 宝格丽网站建设哈尔滨网站建设王道下拉強
  • 烟台网站建设的公司世界500强企业排名2021
  • 网络营销做得比较成功的案例吴中seo网站优化软件
  • 怎么设立网站美区下载的app怎么更新
  • 建立网站ppt做酒店网站所用到的算法
  • 上海网站建设的价格低太仓做网站的公司
  • 怎样登录建设互联网站怎么做中英文网站
  • 云网站7china中小企业网站建设好么
  • 美丽南方官网网站建设国际新闻最新消息今天摘抄
  • 牛商网营销型网站多少钱江门营销型网站建设多少钱
  • 小榄公司网站建设网站交互做的比较好的
  • 深圳定制网站建设怎么改版网站
  • 免费学软件的自学网站江阴建设局网站
  • 网站做多久苍南县网站集约化建设
  • 深圳电子烟网站建设罗湖建设公司网站建设
  • 酒店 深圳 网站建设新项目首码对接平台
  • 岳阳市住房和城乡建设局网站上海专业网站建设网
  • 营销型网站建设设定包括哪些方面网站建设后的心得
  • 建立网站来网上销售的英文潢川城乡建设局网站
  • 仿站建站教程网站怎么接广告
  • 免费下载代码项目的网站长春网站建设找新生科技
  • 博兴县建设局网站做网站要用什么服务器吗
  • 成都中小企业网站建设公司怎么挑选网站建设公司