当我运行程序JPA不会在MySQL

问题描述:

创建表下面是我的命名实体类:当我运行程序JPA不会在MySQL

package az.bank.entities; 
import java.io.Serializable; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.Table; 

@Entity 
@Table (name = "cards") 
public class Card implements Serializable{ 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 
    private String cardHolder; 
    private String cardNumber; 
    private String cardPassword; 
    private String expiryYear; 
    private String expiryMonth; 
    private String cardType; 
    private double cardBalance; 
} 

这里是我的persistance.xml文件:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"> 
    <persistence-unit name="BankServicePU" transaction-type="JTA"> 
     <jta-data-source>jdbc/BankService</jta-data-source> 
     <class>az.bank.entities.Card</class> 
     <exclude-unlisted-classes>true</exclude-unlisted-classes> 
     <properties> 
      <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" /> 
      <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/cards" /> 
      <property name="javax.persistence.jdbc.user" value="root" /> 
      <property name="javax.persistence.jdbc.password" value="root" /> 
      <property name="javax.persistence.schema-generation.database.action" value="create"/> 
     </properties> 
    </persistence-unit> 
</persistence> 

我已经创建了连接池命名jdbc/BankService和mySQL方案命名卡片。但是当我部署和运行程序时,它不会在该方案中创建表。请帮助我在这里做错了什么。

+1

什么是持久性提供程序?冬眠?数据库是否已经包含卡表,并且您希望每次都删除和替换? –

+0

我的持久性提供者是eclipselink。但我也将其改为休眠。同样的问题依然存在。 –

+0

为什么不看看你的jpa提供程序的日志,因为这是它存在的原因? – DN1

我想,你的情况,你不初始化EntityManagerFactory,这意味着你的EclipseLink不接收命令来创建一个表,甚至连接到数据库。

在你的情况下,你可以尝试使用ServletContextListener,它必须与你的web.xml文件重组。

简单的例子:

的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_3_0.xsd" 
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
     version="3.0"> 
    <listener> 
     <listener-class> 
      com.mberazouski.*.AppServletContextListener 
     </listener-class> 
    </listener> 
</web-app> 

开始的Servlet 3.0,你可以只使用@WebListener注释,而不是登记web.xml

AppServletContextListener.java

package com.mberazouski.*; 

import javax.persistence.EntityManager; 
import javax.persistence.EntityManagerFactory; 
import javax.persistence.Persistence; 
import javax.servlet.ServletContextEvent; 
import javax.servlet.ServletContextListener; 

public class AppServletContextListener implements ServletContextListener { 
    private static EntityManagerFactory emf; 

    public void contextInitialized(ServletContextEvent event) { 
     emf = Persistence.createEntityManagerFactory("default"); 
     createEntityManager(); 
    } 

    public void contextDestroyed(ServletContextEvent event) { 
     emf.close(); 
    } 

    public static EntityManager createEntityManager() { 
     if (emf == null) { 
      throw new IllegalStateException("Context is not initialized yet."); 
     } 

     return emf.createEntityManager(); 
    } 
} 

所以你persistence.xml是绝对有效的。适用于我的域模型文件看起来像:

RESOURCE_LOCAL

您可以配置通过RESOURCE_LOCAL的连接。

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.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 http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> 
    <persistence-unit name="default" transaction-type="RESOURCE_LOCAL"> 
     <class>com.mberazouski.*.domain.Cards</class> 
     <properties> 
      <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/> 
      <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/rsreu"/> 
      <property name="javax.persistence.jdbc.user" value="root"/> 
      <property name="javax.persistence.jdbc.password" value="root"/> 
      <property name="javax.persistence.schema-generation.database.action" value="create"/> 
     </properties> 
    </persistence-unit> 
</persistence> 

JTA - 数据 - 源

在这种情况下,所有的配置将来自Resource块采取从你的Tomcat:

的Tomcat
<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.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 http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> 
    <persistence-unit name="default" transaction-type="JTA"> 
     <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
     <jta-data-source>java:comp/env/jdbc/EclispeLinkDB</jta-data-source> 
     <class>com.mberazouski.*.domain.Cards</class> 
     <properties> 
      <property name="javax.persistence.schema-generation.database.action" value="create"/> 
     </properties> 
    </persistence-unit> 
</persistence> 

输出开始: enter image description here

但我也建议你看看的方向。使用初始化方法,您可以直接从配置文件初始化EntityManagerFactory

的applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 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-3.0.xsd"> 

    <bean id="emf" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean "> 
     <property name="persistenceUnitName" value="default"/> 
    </bean> 
</beans> 

希望这会有所帮助。

如果您的数据库已经包含卡表,那么先放下它。使用

<property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/> 
+0

问题是我的DB不包含任何卡表。 –