2017-10-07 10 views
1

でテーブルを作成しません実行クラスという名前の私のエンティティである:私はプログラム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

答えて

0

私はあなたのケースでは、あなたのEclipseLinkは、テーブルを作成しても、DBに接続するためのコマンドを受信して​​いないことを意味EntityManagerFactoryを初期化しないと仮定します。

あなたの場合はファイルで再登録する必要があるServletContextListenerを使用することができます。

クイック例:あなただけweb.xml@WebListener代わりに注釈登録を使用することができますサーブレット3.0の起動

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> 

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は絶対に有効です。あなたは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ブロックから行われます: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> 

出力が開始: enter image description here

しかし、私はまたあなたに方向を見ることをお勧めしますspring。イニシャライザ手法を使用すると、コンフィギュレーションファイルから直接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> 

は、これが役立つことを願っています。

1

DBに既にカードテーブルが含まれている場合は、最初に削除してください。使用

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

私のDBにはカードテーブルが含まれていないという問題があります。 –

関連する問題