hibernate - Tomcat 忽略 persistence.xml

标签 hibernate tomcat jpa

在我看来,Tomcat 忽略了 presistence.xml,但我将它放在正确的目录中,并且当我部署我的 .war 项目时,表不会在我的数据库中创建。

我的 pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>myproject.new</groupId>
    <artifactId>myproject.new.jsfProject</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>
    <name>JSsjProject</name>
    <properties>

        <jdk.version>1.7</jdk.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>4.2.4.Final</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>4.1.8.Final</version>
        </dependency>

        <dependency>
            <groupId>org.hibernate.javax.persistence</groupId>
            <artifactId>hibernate-jpa-2.0-api</artifactId>
            <version>1.0.1.Final</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate.common</groupId>
            <artifactId>hibernate-commons-annotations</artifactId>
            <version>4.0.2.Final</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.25</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.0.1</version>
        </dependency>


        <dependency>
            <groupId>com.sun.faces</groupId>
            <artifactId>jsf-api</artifactId>
            <version>2.1.13</version>
        </dependency>
        <dependency>
            <groupId>com.sun.faces</groupId>
            <artifactId>jsf-impl</artifactId>
            <version>2.1.13</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>org.primefaces</groupId>
            <artifactId>primefaces</artifactId>
            <version>3.4</version>
        </dependency>
    </dependencies>

    <build>
        <finalName>JsfProject</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.1</version>
                <configuration>
                    <url>http://localhost:8081/manager/text</url>
                    <server>my-tomcat</server>
                    <path>/JsfProject</path>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.3.2</version>
                <configuration>
                    <source>${jdk.version}</source>
                    <target>${jdk.version}</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

我的 persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" version="2.1">

    <persistence-unit name="MyPersistenceUnit" transaction-type="RESOURCE_LOCAL" >
        <provider>org.hibernate.ejb.HibernatePersistence</provider>

        <properties>
            <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/testbd"/>
            <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
            <property name="hibernate.connection.username" value="root"/>
            <property name="hibernate.connection.password" value="root"/>
            <property name="hibernate.archive.autodetection" value="class"/>
            <property name="hibernate.hbm2ddl.import_files" value= "import.sql"/>
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.format_sql" value="true"/>
            <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
        </properties>
    </persistence-unit>
</persistence>

我的项目结构:

enter image description here

当我什至从我的项目中删除持久性 xml 并进行部署时,TomCat 仍然没有反应,没有错误,没有警告。你们能帮帮我吗?

更新1 我更改我的 persistence.xml:

 <property name="hibernate.hbm2ddl.auto" value="update"/> 

这也是我的 UsersDao 服务:

public class UserDao {

    private EntityManager entityManager;

    public UserDao(){
        entityManager = Persistence.createEntityManagerFactory("MyPersistenceUnit").createEntityManager();
    }
    public void setEntityManager(EntityManager entityManager) {
        this.entityManager = entityManager;
    }

    public EntityManager getEntityManager() {
        return entityManager;
    }


    public Users findUserById(Long id){
       Users user = null;
       user = entityManager.find(Users.class,id);
       System.out.println("Find user: " + user.getUser() + " " + user.getPass());
       return user;

    }
    public Users findByName(String username) {
        System.out.println("IN FIND BY NAME");
        Users user = null;
        List result = (List) entityManager.createQuery(
                "select u from Users u where u.user = :userName").setParameter("userName", username).getResultList();
        if(!result.isEmpty()){
            user  = (Users) result.get(0);
        }
        System.out.println("FIND USER " + user);
        return user;
    }

    public boolean addUser(Users user){
        try {
            entityManager.merge(user);
            return true;
        }catch (Exception e){
            System.out.println("Error in addUser() -->" + e.getMessage());
            return false;
        }
    }

    public boolean checkAvailable(String userName) {

        Query query =  entityManager
                .createQuery("select count(*) from Users"
                        + " u where u.user = :userName").setParameter("userName", userName);
        Long count = (Long) query.getSingleResult();
        return count < 1;
    }


}

我的用户实体:

@Entity
@Table(name ="userinfo")
public class Users implements Serializable{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    public void setId(Long id) {
        this.id = id;
    }

    public Long getId() {
        return id;
    }

    private String user;
    @Column(nullable = false)
    private String role;

    public String getRole() {
        return role;
    }

    public void setRole(String role) {
        this.role = role;
    }

    public String getUser() {
        return user;
    }

    public void setUser(String user) {
        this.user = user;
    }

    private String pass;

    public String getPass() {
        return pass;
    }

    public void setPass(String pass) {
        this.pass = pass;
    }
}

但是当我部署我的项目时,用户信息表仍然没有创建!为什么?

更新2 persistence.xml 路径 enter image description here

最佳答案

您的配置是:

该值将在 tomcat 关闭后删除该表。

将其更改为“更新”。

其他详细信息是:<persistence-unit name="MyPersistenceUnit" transaction-type="RESOURCE_LOCAL" > .使用此配置,您需要确保 Persistence.createEntityManagerFactory("YOUR_PERSISTENCE_UNIT"); .

如果上面的代码没有被调用,你的表将不会被创建。您可以创建一个在服务器启动后调用的监听器,或者在您的项目的第一个页面访问中触发一些方法。

关于hibernate - Tomcat 忽略 persistence.xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25089125/

相关文章:

java - 如何使用继承处理 JPA CollectionTable?

java - 使用 hibernate 时出现意外行为

java - 从线程内部调用时 Spring 数据存储库 find 方法挂起

JavaMelody 开销而不是 JMX

java - 如何在公共(public)库中使用使用 Spring 的 jar?

hibernate - 避免使用缓存 Hibernate 关联或缓存集合作为整体进行 n+1 选择

java - 如何知道 Web 请求中提供的文件

java - JPA 2 @SequenceGenerator @GeneratedValue 产生唯一约束冲突

java - 了解 Spring Data 接口(interface)

java - 通过多个实体在Spring Data Repository中自定义@Query