1 | |
|
2 | |
|
3 | |
|
4 | |
|
5 | |
|
6 | |
|
7 | |
|
8 | |
|
9 | |
|
10 | |
|
11 | |
|
12 | |
|
13 | |
|
14 | |
|
15 | |
|
16 | |
|
17 | |
package org.kuali.rice.kns.org.kuali.rice.krad.app.persistence.jpa; |
18 | |
|
19 | |
import org.kuali.rice.core.api.config.property.Config; |
20 | |
import org.kuali.rice.core.api.config.property.ConfigContext; |
21 | |
import org.kuali.rice.core.framework.persistence.jpa.DevHibernateJpaVendorAdapter; |
22 | |
import org.springframework.orm.jpa.JpaVendorAdapter; |
23 | |
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; |
24 | |
import org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager; |
25 | |
import org.springframework.orm.jpa.persistenceunit.PersistenceUnitManager; |
26 | |
|
27 | |
import javax.sql.DataSource; |
28 | |
import java.util.HashMap; |
29 | |
import java.util.Map; |
30 | |
|
31 | |
|
32 | |
|
33 | |
|
34 | |
public class RiceLocalContainerEntityManagerFactoryBean extends LocalContainerEntityManagerFactoryBean { |
35 | |
|
36 | 0 | public RiceLocalContainerEntityManagerFactoryBean() { |
37 | 0 | throw new RuntimeException(getClass().getName() + " can not be constructed without a datasource"); |
38 | |
} |
39 | |
|
40 | |
public RiceLocalContainerEntityManagerFactoryBean(DataSource datasource) { |
41 | 0 | this("", datasource); |
42 | 0 | } |
43 | |
|
44 | 0 | public RiceLocalContainerEntityManagerFactoryBean(String prefix, DataSource datasource) { |
45 | 0 | if (prefix.equals("")) { |
46 | 0 | prefix = "rice"; |
47 | |
} |
48 | 0 | prefix += ".jpa."; |
49 | |
|
50 | 0 | Config config = ConfigContext.getCurrentContextConfig(); |
51 | |
|
52 | 0 | setPersistenceUnitManager(preparePersistentUnitManager(config, prefix, datasource)); |
53 | 0 | setPersistenceXmlLocation(determineConfigProperty(config, prefix, "PersistenceXmlLocation", "META-INF/persistence.xml")); |
54 | 0 | setDataSource(datasource); |
55 | 0 | setPersistenceUnitName(determineConfigProperty(config, prefix, "PersistenceUnitName", "rice")); |
56 | 0 | setJpaDialect(new org.springframework.orm.jpa.vendor.HibernateJpaDialect()); |
57 | 0 | setJpaPropertyMap(prepareJpaProperties(config, prefix)); |
58 | 0 | setJpaVendorAdapter(prepareJpaVendorAdapter(config, prefix)); |
59 | |
|
60 | 0 | RicePersistenceUnitPostProcessor postProcessor = new RicePersistenceUnitPostProcessor(); |
61 | 0 | postProcessor.setJtaDataSource(datasource); |
62 | 0 | setPersistenceUnitPostProcessors(new RicePersistenceUnitPostProcessor[] { postProcessor }); |
63 | 0 | } |
64 | |
|
65 | |
|
66 | |
private PersistenceUnitManager preparePersistentUnitManager(Config config, String prefix, DataSource datasource) { |
67 | 0 | DefaultPersistenceUnitManager persistenceUnitManager = new DefaultPersistenceUnitManager(); |
68 | 0 | persistenceUnitManager.setDefaultDataSource(datasource); |
69 | 0 | persistenceUnitManager.setPersistenceXmlLocations(new String[] {determineConfigProperty(config, prefix, "PersistenceXmlLocation", "META-INF/persistence.xml")}); |
70 | 0 | persistenceUnitManager.setDefaultPersistenceUnitRootLocation(determineConfigProperty(config, prefix, "PersistenceUnitRootLocation", "classpath:")); |
71 | 0 | RicePersistenceUnitPostProcessor postProcessor = new RicePersistenceUnitPostProcessor(); |
72 | 0 | postProcessor.setJtaDataSource(datasource); |
73 | 0 | persistenceUnitManager.setPersistenceUnitPostProcessors(new RicePersistenceUnitPostProcessor[] { postProcessor }); |
74 | 0 | persistenceUnitManager.afterPropertiesSet(); |
75 | 0 | return persistenceUnitManager; |
76 | |
} |
77 | |
|
78 | |
private JpaVendorAdapter prepareJpaVendorAdapter(Config config, String prefix) { |
79 | 0 | DevHibernateJpaVendorAdapter jpaVendorAdapter = new DevHibernateJpaVendorAdapter(); |
80 | 0 | jpaVendorAdapter.setDatabasePlatform(determineConfigProperty(config, prefix, "DatabasePlatform", "org.hibernate.dialect.MySQLDialect")); |
81 | 0 | jpaVendorAdapter.setGenerateDdl(new Boolean(determineConfigProperty(config, prefix, "GenerateDdl", "false"))); |
82 | 0 | jpaVendorAdapter.setSerializationFilename(determineConfigProperty(config, prefix, "SerializationFilename", "/tmp/Ejb3Configuration.out")); |
83 | 0 | jpaVendorAdapter.setUseSerialization(new Boolean(determineConfigProperty(config, prefix, "UseSerialization", "true"))); |
84 | |
try { |
85 | 0 | jpaVendorAdapter.afterPropertiesSet(); |
86 | 0 | } catch (Exception e) {} |
87 | 0 | return jpaVendorAdapter; |
88 | |
} |
89 | |
|
90 | |
private Map<String, String> prepareJpaProperties(Config config, String prefix) { |
91 | 0 | Map<String, String> jpaProperties = new HashMap<String, String>(); |
92 | |
|
93 | |
|
94 | 0 | jpaProperties.putAll(config.getPropertiesWithPrefix(prefix + "JpaProperties.", true)); |
95 | |
|
96 | |
|
97 | |
|
98 | 0 | jpaProperties.put("hibernate.show_sql", determineConfigProperty(config, prefix, "JpaProperties.hibernate.show_sql", "false")); |
99 | 0 | jpaProperties.put("hibernate.format_sql", determineConfigProperty(config, prefix, "JpaProperties.hibernate.format_sql", "false")); |
100 | 0 | jpaProperties.put("hibernate.use_sql_comments", determineConfigProperty(config, prefix, "JpaProperties.hibernate.use_sql_comments", "false")); |
101 | |
|
102 | |
|
103 | |
|
104 | 0 | jpaProperties.put("hibernate.transaction.manager_lookup_class", determineConfigProperty(config, prefix, "JpaProperties.hibernate.transaction.manager_lookup_class", "org.hibernate.transaction.JOTMTransactionManagerLookup")); |
105 | |
|
106 | 0 | jpaProperties.put("hibernate.current_session_context_class", determineConfigProperty(config, prefix, "JpaProperties.hibernate.current_session_context_class", "org.hibernate.context.JTASessionContext")); |
107 | 0 | jpaProperties.put("hibernate.connection.release_mode", determineConfigProperty(config, prefix, "JpaProperties.hibernate.connection.release_mode", "auto")); |
108 | 0 | jpaProperties.put("hibernate.transaction.flush_before_completion", determineConfigProperty(config, prefix, "JpaProperties.hibernate.transaction.flush_before_completion", "true")); |
109 | 0 | jpaProperties.put("hibernate.bytecode.use_reflection_optimizer", determineConfigProperty(config, prefix, "JpaProperties.hibernate.bytecode.use_reflection_optimizer", "false")); |
110 | 0 | jpaProperties.put("hibernate.transaction.auto_close_session", determineConfigProperty(config, prefix, "JpaProperties.hibernate.transaction.auto_close_session", "false")); |
111 | 0 | jpaProperties.put("hibernate.hbm2ddl.auto", determineConfigProperty(config, prefix, "JpaProperties.hibernate.hbm2ddl.auto", "")); |
112 | |
|
113 | |
|
114 | |
|
115 | 0 | return jpaProperties; |
116 | |
} |
117 | |
|
118 | |
private String determineConfigProperty(Config config, String prefix, String key, String defaultValue) { |
119 | 0 | String value = config.getProperty(prefix + key); |
120 | |
|
121 | 0 | if (value == null) { |
122 | 0 | value = config.getProperty("rice.jpa." + key); |
123 | |
} |
124 | |
|
125 | 0 | return value == null ? defaultValue : value; |
126 | |
} |
127 | |
|
128 | |
} |