当我运行程序时,JPA无法在MySQL中创建表 [英] When I run program JPA does not create table in MySQL

查看:86
本文介绍了当我运行程序时,JPA无法在MySQL中创建表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是我的名为Class的实体

Here is my entity named Class:

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文件:

And here is my persistance.xml file:

<?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的连接池和名为cards的mySQL方案.但是,当我部署并运行程序时,它不会在该方案中创建表.请帮助我在这里做错了什么.

I have created connection pool named jdbc/BankService and mySQL scheme named cards. But when I deploy and run program it does not create table in that scheme. Please help what have I done wrong here.

推荐答案

我想在您的情况下,您不会初始化EntityManagerFactory,这意味着您的eclipselink不会收到创建表甚至连接到的命令.数据库.

I suppose that in your case you don't initialize the EntityManagerFactory which means that your eclipselink does not receive a command to create a tables and even connect to the DB.

根据您的情况,您可以尝试使用ServletContextListener,该文件必须与web.xml文件一起使用.

In your case you can try to use ServletContextListener which have to be regestered withing your web.xml file.

简单示例:

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.stackoverflow.AppServletContextListener
        </listener-class>
    </listener>
</web-app>

从Servlet 3.0开始,您可以仅使用 @WebListener 批注,而不是在web.xml中注册.

Starting Servlet 3.0 you can just use @WebListener annotation instead registration in web.xml.

AppServletContextListener.java

package com.mberazouski.stackoverflow;

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是绝对有效的.适应我的域模型文件看起来像:

So your persistence.xml is absolutely valid. Adapted to my domain model file looks like:

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.stackoverflow.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数据源

在这种情况下,所有配置都将从您的tomcat的Resource块中获取:

In this case all configurations will be taken from Resource block from your 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.stackoverflow.domain.Cards</class>
        <properties>
            <property name="javax.persistence.schema-generation.database.action" value="create"/>
        </properties>
    </persistence-unit>
</persistence>

tomcat开始的输出:

Output of the tomcat start:

但我也建议您研究spring的方向.使用它的初始化方法,您可以直接从配置文件初始化EntityManagerFactory.

But I also suggest you to look into direction of spring. Using it initializer approach you can initialize EntityManagerFactory directly from configuration file.

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>

希望这会有所帮助.

这篇关于当我运行程序时,JPA无法在MySQL中创建表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆