@gengzhengtao
2015-07-14T07:51:28.000000Z
字数 6201
阅读 1303
电商平台broadleafCommerce
Broadleaf概念
关键部分和配置
Broadleaf Commerce初始化配置是使用HSQL数据库,HSQL是一个轻量级的数据库,而且非常有利于开发。当我们启动Web应用程序的时候Broadleaf利用Hibernate的一个功能来创建和填充数据库,这个是通过设置持久化配置的一部分属性来实现的。
让我们来看看一个典型的持久化单元配置:
<persistence-unit name="blPU" transaction-type="RESOURCE_LOCAL">
<properties>
<property name="hibernate.hbm2ddl.auto" value="create-drop"/>
<property name="hibernate.hbm2ddl.import_files" value="my_load_files.sql"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
<property name="hibernate.show_sql" value="false"/>
<property name="hibernate.cache.use_second_level_cache" value="true"/>
<property name="hibernate.cache.use_query_cache" value="true"/>
</properties>
</persistence-unit>
当切换到另外一个数据库时,最重要的前三个属性。
hibernate.hbm2ddl.auto
属性来创建表,使用create-drop
这个值来每次重启应用是重建数据库,这开发环境中使用最好,但是大部分团队在schema稳定下来以后,就会更改此配置import_files
属性来找到需要运行的SQL文件,Broadleaf使用这来填充演示和启动应用程序所需的数据。有些开发团队在项目的早期使用这个配置,但是在后就就会禁用这个配置,使用一个稳定的数据库环境。dialect
属性影响hiberante如果构建SQL遇见,你需要更改dialect
来匹配你的数据库。然而,Broadleaf 提供了一种机制,允许您配置您每个环境所有的 JPA 属性,而不是硬编码你的属性,如上面一样,你可以为每个环境提供不同的配置。因为通常不用的环境需要不同的属性,但是为不同的环境构建具有不同属性的war时通常比较繁琐,所以这一点比较具有吸引力。首先,记住Broadleaf有一个合并处理的进程来将多个配置文件合并为最终的配置。这个过程发生在运行时(runtime),这些合并后的文件通常包含Spring Application context资源文件和JPA persistence.xml文件。这个机制能够让你覆盖和扩展Braodleaf的核心功能。Broadleaf还提供了一个运行环境属性配置器(Runtime Environment Properties Configurer)根据环境不同来将properties文件中正确的属性注入到application context.下面是他如何工作的:
下面是来自于Broadleaf原型典型的JPA persistence.xml文件:
<?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_2_0.xsd"
version="2.0">
<persistence-unit name="blPU" transaction-type="RESOURCE_LOCAL">
<non-jta-data-source>jdbc/web</non-jta-data-source>
<exclude-unlisted-classes/>
</persistence-unit>
<persistence-unit name="blSecurePU" transaction-type="RESOURCE_LOCAL">
<non-jta-data-source>jdbc/webSecure</non-jta-data-source>
<exclude-unlisted-classes/>
</persistence-unit>
<persistence-unit name="blCMSStorage" transaction-type="RESOURCE_LOCAL">
<non-jta-data-source>jdbc/cmsStorage</non-jta-data-source>
<exclude-unlisted-classes/>
</persistence-unit>
</persistence>
我们会发现持久化的提供者和属性没有包含这杯,是因为这是Broadleaf中被拿来合并的一个默认的persitence.xml文件,任何配置都没有被改变,那么上面描述的那些属性呢?为了在Broadleaf配置JPA,我们使用自定义的Broadleaf extension to spring 来合并持久化单元,为了允许为持久性单元后处理器。Broadleaf已经创建了JPAPropertiesPersistenceUnitPostProcessor。有关配置请看这里。
这个方法允许你上面那些调整每个环境的属性,除了这些事情,还可以使用在开发过程中使用不同的数据库方言,这样比在QA与生产过程中修改好的多。
此外,你需要为你的数据库配置Broaleaf数据源持久化配置,默认的Broadleaf Commerce使用JNDI从服务查找,请根据你的服务器文档配置你的JNDI数据源。
对于应用程序中每一个持久化单元(persistence unit),你需要修改hibernate.dialect
属性来指向你正在使用的数据库。你可以参考Hibernate API 文档来查看可用的方言
下面是修改每个环境中数据库属性的步骤:
1. 根据你的服务器文档配置你的JNDI数据源。对于本地Jetty服务器,你可以在site/src/webapp/WEB-INF/jetty-env.xml
查看它的配置。除非你的应用在Jetty上运行,否则忽略掉它。在大多数情况下,使用默认的配置,你将需要三个数据源jdbc/web
,jdbc/secure
,jdbc/storage
(你不能讲他们组合未一个,因为多事务管理器不能绑定在一个数据源上。)
2. 打开site/src/webapp/WEB-INF/applicationContext-datasources.xml
并确保他是按照你的JNDI配置进行配置的。除非你的数据源使用的是一个不同的JNDI名称,否则这个配置是不需要改变的。(通常情况下,你不需要修改这个文件。)
3. 如果你增加了额外的JNDI属性,或者没有使用webDS(jdbc /web
)的默认JNDI名称,那么你就需要修改site/src/webapp/WEB-INF/web.xml
文件,(注意:通常情况下不需要修改这个文件)
<resource-ref>
<!-- Change this JNDI name and/or add additional resource-refs for
new JNDI names. Typically you should not need to change this. -->
<res-ref-name>jdbc/web</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
4. 为了使开发环境中正确设置JPA,需要针对与每个环境修改配置文件。这些文件位于每个项目中(即:core,site,admin)中的src/main/resources/runtime-properties.下面是core/src/main/resources/runtime-properties/common-shared.properties:
# Settings for the default persistence unit
blPU.hibernate.hbm2ddl.auto=validate
blPU.hibernate.dialect=org.hibernate.dialect.HSQLDialect
blPU.hibernate.show_sql=false
blPU.hibernate.cache.use_second_level_cache=true
blPU.hibernate.cache.use_query_cache=true
blPU.hibernate.hbm2ddl.import_files=null
# Settings for the CMS storage persistence unit
blCMSStorage.hibernate.hbm2ddl.auto=validate
blCMSStorage.hibernate.dialect=org.hibernate.dialect.HSQLDialect
blCMSStorage.hibernate.show_sql=false
blCMSStorage.hibernate.cache.use_second_level_cache=true
blCMSStorage.hibernate.cache.use_query_cache=true
blCMSStorage.hibernate.hbm2ddl.import_files=null
# Settings for the secure persistence unit
blSecurePU.hibernate.hbm2ddl.auto=validate
blSecurePU.hibernate.dialect=org.hibernate.dialect.HSQLDialect
blSecurePU.hibernate.show_sql=false
blSecurePU.hibernate.cache.use_second_level_cache=false
blSecurePU.hibernate.cache.use_query_cache=false
blSecurePU.hibernate.hbm2ddl.import_files=null
5. 在每个 web 应用程序中的环境属性进行适当的更改(例如,site/src/main/resources/runtime-properties/*.properties
使用持久化单元前置名称的属性(例如blPU
,blSecurePU
)的值将会在运行时替换或新增为正确的值。每个应用程序的特定属性将优先于共享的属性,同时又优于Broadleaf的默认属性。为了让QA有一个单独的不同的配置。将下面的内容添加到 site/main/resources/runtime-properties/integrationqa.properties:
lPU.hibernate.dialect=org.hibernate.dialect.Oracle10gDialect
blCMSStorage.hibernate.dialect=org.hibernate.dialect.Oracle10gDialect
blSecurePU.hibernate.dialect=org.hibernate.dialect.Oracle10gDialect
这样在“integrationqa”环境中三个持久化单元的数据库方言都会改为Oracle 10g
另一个有趣的用法,这可能是你想要在不同环境中运行不同的数据库脚本,由于语法或数据类型的不同。来看一下 site/main/resources/runtime-properties/development.properties这个文件:
blPU.hibernate.hbm2ddl.import_files=/sql/load_admin_security.sql,\
/sql/load_admin_users.sql,\
/sql/load_code_tables.sql,\
/sql/load_table_sequences.sql,\
/sql/load_catalog_data.sql,\
/sql/load_content_structure.sql,\
/sql/load_content_data.sql
如果这个文件没有重写方言的话,那么它将使用HSQLDB方言。当时用分号将SQL脚本列表进行了分隔,这些脚本应该在表创建完后执行。也许QA会使用ORacle并且仍然需要加载一些基础数据。由于Oracle与HSQLDB在语法上略有不同,所以QA的配置可能是下面的样子:
blPU.hibernate.dialect=org.hibernate.dialect.Oracle10gDialect
blPU.hibernate.hbm2ddl.import_files=/sql/load_admin_security.sql,\
/sql/oracle/load_admin_users.sql,\
/sql/oracle/load_code_tables.sql,\
/sql/oracle/load_table_sequences.sql,\
/sql/oracle/load_catalog_data.sql,\
/sql/oracle/load_content_structure.sql,\
/sql/oracle/load_content_data.sql
blCMSStorage.hibernate.dialect=org.hibernate.dialect.Oracle10gDialect
blSecurePU.hibernate.dialect=org.hibernate.dialect.Oracle10gDialect
如你所见,你可以配置和重写每个环境的JPA属性。当然,你还可以预先配置你的数据源的JNDI名称,各种JPA运行时的属性,比如dialect,SQL logging,DDL,二级缓存以及导入脚本。这样应用程序就可以非常方便的改变环境配置。
更多关于运行时属性配置的详细信息,请参与Runtime Environment Configuration