实体表不是使用JPA 2.1创建的

时间:2014-08-25 15:30:30

标签: java jpa netbeans ejb-3.0 jpa-2.1

我在Netbeans中使用JPA 2.1来创建我的实体。如果我的数据库没有表,那么它应该从实体创建表。

当我部署并运行我的企业应用程序时,userEntity表没有出现在我的mySQL数据库中。

这里有什么帮助吗? :)

以下是我的代码。

的persistence.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="CommonInfrastructure-ejbPU" transaction-type="JTA">
    <jta-data-source>jdbc/commonInfraDatasource</jta-data-source>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <properties>
      <property name="javax.persistence.schema-generation.database.action" value="create"/>
    </properties>
  </persistence-unit>
</persistence>

userEntity.java

package entity;

import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class userEntity implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long systemUserId;
    private String userName;
    private String password;
    private String email;
    private int activateStatus;
    private String accessGroup;
    private int lockOutStatus;



    @Override
    public int hashCode() {
        int hash = 0;
        hash += (getSystemUserId() != null ? getSystemUserId().hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
// TODO: Warning - this method won't work in the case the systemUserId fields are not set
        if (!(object instanceof userEntity)) {
            return false;
        }
        userEntity other = (userEntity) object;
        if ((this.getSystemUserId() == null && other.getSystemUserId() != null) || (this.getSystemUserId() != null && !this.systemUserId.equals(other.systemUserId))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "entity.userEntity[id=" + getSystemUserId() + "]";
    }

    /**
     * @return the systemUserId
     */
    public Long getSystemUserId() {
        return systemUserId;
    }

    /**
     * @param systemUserId the systemUserId to set
     */
    public void setSystemUserId(Long systemUserId) {
        this.systemUserId = systemUserId;
    }

    /**
     * @return the userName
     */
    public String getUserName() {
        return userName;
    }

    /**
     * @param userName the userName to set
     */
    public void setUserName(String userName) {
        this.userName = userName;
    }

    /**
     * @return the password
     */
    public String getPassword() {
        return password;
    }

    /**
     * @param password the password to set
     */
    public void setPassword(String password) {
        this.password = password;
    }

    /**
     * @return the email
     */
    public String getEmail() {
        return email;
    }

    /**
     * @param email the email to set
     */
    public void setEmail(String email) {
        this.email = email;
    }

    /**
     * @return the activateStatus
     */
    public int getActivateStatus() {
        return activateStatus;
    }

    /**
     * @param activateStatus the activateStatus to set
     */
    public void setActivateStatus(int activateStatus) {
        this.activateStatus = activateStatus;
    }

    /**
     * @return the accessGroup
     */
    public String getAccessGroup() {
        return accessGroup;
    }

    /**
     * @param accessGroup the accessGroup to set
     */
    public void setAccessGroup(String accessGroup) {
        this.accessGroup = accessGroup;
    }

    /**
     * @return the lockOutStatus
     */
    public int getLockOutStatus() {
        return lockOutStatus;
    }

    /**
     * @param lockOutStatus the lockOutStatus to set
     */
    public void setLockOutStatus(int lockOutStatus) {
        this.lockOutStatus = lockOutStatus;
    }
}

太阳resources.xml中

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE resources PUBLIC "-//Sun Microsystems, Inc.//DTD Application Server 9.0 Resource Definitions //EN" "http://www.sun.com/software/appserver/dtds/sun-resources_1_3.dtd">
<resources>
  <jdbc-resource enabled="true" jndi-name="jdbc/commonInfraDatasource" object-type="user" pool-name="CommonInfraConnectionPool">
    <description/>
  </jdbc-resource>
  <jdbc-connection-pool allow-non-component-callers="false" associate-with-thread="false" connection-creation-retry-attempts="0" connection-creation-retry-interval-in-seconds="10" connection-leak-reclaim="false" connection-leak-timeout-in-seconds="0" connection-validation-method="auto-commit" datasource-classname="com.mysql.jdbc.jdbc2.optional.MysqlDataSource" fail-all-connections="false" idle-timeout-in-seconds="300" is-connection-validation-required="false" is-isolation-level-guaranteed="true" lazy-connection-association="false" lazy-connection-enlistment="false" match-connections="false" max-connection-usage-count="0" max-pool-size="32" max-wait-time-in-millis="60000" name="CommonInfraConnectionPool" non-transactional-connections="false" pool-resize-quantity="2" res-type="javax.sql.DataSource" statement-timeout-in-seconds="-1" steady-pool-size="8" validate-atmost-once-period-in-seconds="0" wrap-jdbc-objects="false">
    <property name="URL" value="jdbc:XXXXXXXXXX"/>
    <property name="User" value="XXXXXXXXX"/>
    <property name="Password" value="XXXXXXXXX"/>
  </jdbc-connection-pool>
</resources>

其他信息 我启动Glassfish服务器并右键单击并部署我的企业应用程序。 这应该在我的数据库中创建userEntity表吗? 但事实并非如此。 enter image description here

6 个答案:

答案 0 :(得分:4)

无论如何,我设法解决了这个问题。

在创建表之前,您需要使用JPA执行某些操作。

例如......

package sessionBean;

import javax.ejb.Stateless;
import entity.userEntity;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

    @Stateless
    public class userSessionBean implements userSessionBeanLocal {

        @PersistenceContext
        private EntityManager entityManager;

        @Override
        public userEntity getUser(String userName) {
            Query query = entityManager.createQuery("SELECT u FROM userEntity u WHERE u.userName = :inUserName");
            query.setParameter("inUserName", userName);
            userEntity systemUser = null;
            try {
                systemUser = (userEntity) query.getSingleResult();
            } catch (NoResultException ex) {
                ex.printStackTrace();
            }
            return systemUser;
        }


    }

答案 1 :(得分:4)

强制EclipseLink在部署期间创建表,添加:

netstat

到你的persistence.xml。默认情况下,通常在首次从应用程序访问EMF时,会在需要时创建表。 此行为在JPA 2.1规范的第9.4节中定义。

答案 2 :(得分:1)

对于我来说,在持久性单元中添加了一行。

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

答案 3 :(得分:0)

persistence.xml文件中添加下一个属性。

<property name="eclipselink.ddl-generation" value="drop-and-create-tables"/>

答案 4 :(得分:0)

以防有人感兴趣: 似乎从JPA 2.1 / Glassfish 4.1开始,你需要在创建表之前的某个地方使用你的PU。这两行应该足够了,即在EJB中:

@PersistenceContext
private EntityManager em;

@PersistenceContext(unitName = "CommonInfrastructure-ejbPU")
private EntityManager em;

另见我的回答:How to use JPA with Java EE 7, Glassfish 4.1 and Maven on JavaDB

答案 5 :(得分:0)

请注意,如果您使用<property name="hibernate.hbm2ddl.auto" value="create" />

它将清除数据库中的所有现有数据。