我在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表吗? 但事实并非如此。
答案 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" />
它将清除数据库中的所有现有数据。