这似乎是一件非常基础的东西,我应该能够很容易地找到它,但我找不到它的答案!
在Spring 3.2.4文档中,它表明已删除对Toplink Essentials的供应商支持: http://docs.spring.io/autorepo/docs/spring-framework/3.2.4.RELEASE_to_4.0.0.M3/changes/pkg_org.springframework.orm.jpa.vendor.html
但我无处可以找到实际使用此类的替代方法 - 使用Spring配置Toplink的所有示例似乎都是在Spring 2.5左右的时候,例如https://community.oracle.com/thread/597157
有人能告诉我现在为Toplink JPA实现定义spring应用程序上下文的方法是什么吗?
我正在使用:
我当前的代码和配置设置如下所示,它的工作原理 - 我在模拟Web应用程序中转到/help
时创建了数据库 - 但它并没有创建我的实体表自动,这是我现在主要尝试找到解决方案。我怀疑它是因为下面定义的所有内容都是一个简单的JDBC数据源,而不是一个适当的JPA实体管理器工厂,可以为我自动创建所有实体。
在我将其迁移到WAR并将其部署到Tomcat之前,我有一个使用相同persistence.xml
的独立Java应用程序,它工作正常(自动创建数据库和实体表)。现在我已经转移到Web应用程序并将Spring放入混合中,而不是: - (
基本上,我知道我需要在Spring应用程序上下文中的某处指定create-tables
(或generateDdl=true
),就像在persistence.xml
文件中一样,但我不是确定如何在没有TopLinkJpaVendorAdapter
类的情况下执行此操作(请参阅下面applicationContext.xml
中注释掉的元素)。
Spring实体管理器工厂似乎引用了persistence.xml
中定义的持久性单元名称,但似乎没有注意到那里定义的其余内容 - 是否存在我可以让Spring从persistence.xml
中定义的内容中获取其他设置(即Toplink实体管理器工厂提供程序类和JDBC详细信息等)吗?或者,如果Spring已经放弃了供应商的实现,那么它是否值得继续沿着Toplink的路走下去,而只是选择Eclipselink或Hibernate? (顺便说一下,有没有人知道为什么这个实现类首先被删除了?)
META-INF / persistence.xml中:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0"
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 persistence_1_0.xsd">
<persistence-unit name="xyz-jpa" transaction-type="RESOURCE_LOCAL">
<provider>oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider</provider>
<class>org.xyz.MyDbEntity</class>
<properties>
<!--
<property name="toplink.jdbc.user" value="league"/>
<property name="toplink.jdbc.password" value="league"/>
-->
<property name="toplink.jdbc.url" value="jdbc:derby:xyz;create=true"/>
<property name="toplink.jdbc.driver" value="org.apache.derby.jdbc.EmbeddedDriver"/>
<property name="toplink.ddl-generation" value="create-tables"/>
</properties>
</persistence-unit>
</persistence>
WEB-INF /弹簧/ applicationContext.xml中:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<mvc:annotation-driven/>
<context:component-scan base-package="org.xyz.web" />
<!-- <context:spring-configured /> -->
<context:load-time-weaver aspectj-weaving="autodetect"/>
<!--+
| (1) Define a Spring JDBC datasource wrapper for an embedded Derby database
+-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="org.apache.derby.jdbc.EmbeddedDriver"/>
<property name="url" value="jdbc:derby:xyz;create=true"/>
</bean>
<!--+
| (2) Define a Spring ORM entity manager factory bean wrapper for a Toplink JPA implementation
+-->
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitName" value="xyz-jpa"/>
<property name="dataSource" ref="dataSource"/>
<!--
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.TopLinkJpaVendorAdapter">
<property name="showSql" value="true"/>
<property name="generateDdl" value="true"/>
<property name="databasePlatform" value="oracle.toplink.essentials.platform.database.DerbyPlatform"/>
</bean>
</property>
<property name="jpaProperties">
<props>
<prop key="toplink.weaving">static</prop>
<prop key="toplink.logging.level">FINEST</prop>
<prop key="toplink.ddl-generation">create-tables</prop>
<prop key="toplink.ddl-generation.output-mode">both</prop>
<prop key="toplink.drop-ddl-jdbc-file-name">generated_jpa.sql</prop>
</props>
</property>
<property name="loadTimeWeaver">
<bean class="org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader" />
</property>
-->
</bean>
<!-- (3) Define a Spring ORM transaction manager wrapper for (1) and (2) -->
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="helpController" class="org.xyz.web.HelpController">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
</beans>
WEB-INF / web.xml中:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<display-name>XYZ</display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/applicationContext.xml</param-value>
</context-param>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value></param-value> <!-- No servlet specific context config file (i.e. "dispatcher-servlet.xml") => use applicationContext.xml -->
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
META-INF / context.xml中:
<Context path="/" reloadable="true">
<Loader loaderClass="org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader"/>
</Context>
org.xyz.web.HelpController:
@RestController
public class HelpController {
private EntityManagerFactory entityManagerFactory;
public HelpController() {
}
public EntityManagerFactory getEntityManagerFactory() {
return entityManagerFactory;
}
public void setEntityManagerFactory(EntityManagerFactory entityManagerFactory) {
this.entityManagerFactory = entityManagerFactory;
}
@RequestMapping( value="/help", produces=MediaType.TEXT_HTML_VALUE )
public @ResponseBody String getHelp() {
EntityManager entityManager = entityManagerFactory.createEntityManager();
return "Helpy Mc Help-Help";
}
}
答案 0 :(得分:2)
来自TopLink上的Wikipedia page:
2007年,TopLink源代码被捐赠给Eclipse Foundation,EclipseLink项目诞生了。
因此,TopLink的开源版本现在以EclipseLink为基础,这是JPA 2.0的参考实现。
除非您有一个非常具体的原因使用TopLink Essentials(由于您使用的是最新版本的Spring框架和Tomcat,这似乎不太可能),您应该使用其他一个JPA实现。