java hibernate with jpa不会停止
我从hibernate和JPA开始,我一直在关注几个关于JPA的教程,其中包括Netbeans上的eclipse链接,然而,在仍在使用Netbeans时,我下载了hibernate-release-5.2.7。最终的从Hibernate网页手动压缩,如下所述:http://docs.jboss.org/hibernate/orm/5.2/quickstart/html_single/#_the_hibernate_modules_artifacts 我将lib/required目录和lib/jpa元模型生成器/添加到我的java应用程序和mysql conector jar中,然后创建了我的持久性。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="Aplication" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<properties>
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/hibernate?zeroDateTimeBehavior=convertToNull"/>
<property name="javax.persistence.jdbc.user" value="root"/>
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
<property name="javax.persistence.jdbc.password" value="verde"/>
<property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect" />
<property name="hibernate.hbm2ddl.auto" value="update" />
</properties>
</persistence-unit>
</persistence>
然后我创建了一个示例实体Prueba:
package Model;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table
public class Prueba implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column
private String nombre;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
@Override
public int hashCode() {
int hash = 0;
hash += (id != null ? id.hashCode() : 0);
return hash;
}
@Override
public boolean equals(Object object) {
// TODO: Warning - this method won't work in the case the id fields are not set
if (!(object instanceof Prueba)) {
return false;
}
Prueba other = (Prueba) object;
if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
return false;
}
return true;
}
@Override
public String toString() {
return "Model.Prueba[ id=" + id + " ]";
}
}
我通过NetBeans向导从Entity添加了一个JPA ControllerClass:
package Model;
import Model.exceptions.NonexistentEntityException;
import java.io.Serializable;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
/**
*
* @author Spencer
*/
public class PruebaJpaController implements Serializable {
public PruebaJpaController(EntityManagerFactory emf) {
this.emf = emf;
}
private EntityManagerFactory emf = null;
public EntityManager getEntityManager() {
return emf.createEntityManager();
}
public void create(Prueba prueba) {
EntityManager em = null;
try {
em = getEntityManager();
em.getTransaction().begin();
em.persist(prueba);
em.getTransaction().commit();
} finally {
if (em != null) {
em.close();
}
}
}
public void edit(Prueba prueba) throws NonexistentEntityException, Exception {
EntityManager em = null;
try {
em = getEntityManager();
em.getTransaction().begin();
prueba = em.merge(prueba);
em.getTransaction().commit();
} catch (Exception ex) {
String msg = ex.getLocalizedMessage();
if (msg == null || msg.length() == 0) {
Long id = prueba.getId();
if (findPrueba(id) == null) {
throw new NonexistentEntityException("The prueba with id " + id + " no longer exists.");
}
}
throw ex;
} finally {
if (em != null) {
em.close();
}
}
}
public void destroy(Long id) throws NonexistentEntityException {
EntityManager em = null;
try {
em = getEntityManager();
em.getTransaction().begin();
Prueba prueba;
try {
prueba = em.getReference(Prueba.class, id);
prueba.getId();
} catch (EntityNotFoundException enfe) {
throw new NonexistentEntityException("The prueba with id " + id + " no longer exists.", enfe);
}
em.remove(prueba);
em.getTransaction().commit();
} finally {
if (em != null) {
em.close();
}
}
}
public List<Prueba> findPruebaEntities() {
return findPruebaEntities(true, -1, -1);
}
public List<Prueba> findPruebaEntities(int maxResults, int firstResult) {
return findPruebaEntities(false, maxResults, firstResult);
}
private List<Prueba> findPruebaEntities(boolean all, int maxResults, int firstResult) {
EntityManager em = getEntityManager();
try {
CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
cq.select(cq.from(Prueba.class));
Query q = em.createQuery(cq);
if (!all) {
q.setMaxResults(maxResults);
q.setFirstResult(firstResult);
}
return q.getResultList();
} finally {
em.close();
}
}
public Prueba findPrueba(Long id) {
EntityManager em = getEntityManager();
try {
return em.find(Prueba.class, id);
} finally {
em.close();
}
}
public int getPruebaCount() {
EntityManager em = getEntityManager();
try {
CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
Root<Prueba> rt = cq.from(Prueba.class);
cq.select(em.getCriteriaBuilder().count(rt));
Query q = em.createQuery(cq);
return ((Long) q.getSingleResult()).intValue();
} finally {
em.close();
}
}
}
接下来,我创建了一个用于测试Hibernate的快速Dao:
package Model;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
public class PruebaDao {
private static EntityManagerFactory em;
private static PruebaJpaController pjpa;
public PruebaDao(){
em = Persistence.createEntityManagerFactory("Aplication");
pjpa = new PruebaJpaController(em);
}
public void addPrueba(Prueba pb){
pjpa.create(pb);
}
}
在创建我的主类之后:
package javaapplication7;
import Model.Prueba;
import Model.PruebaDao;
/**
*
* @author Spencer
*/
public class JavaApplication7 {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
Prueba pb = new Prueba();
PruebaDao pbdao = new PruebaDao();
pb.setNombre("numerouno");
pbdao.addPrueba(pb);
}
}
一切正常对象已添加到MySQL,但应用程序未在完成时关闭日志如下:
feb 13, 2017 4:51:55 AM org.hibernate.jpa.internal.util.LogHelper logPersistenceUnitInformation
INFO: HHH000204: Processing PersistenceUnitInfo [
name: Aplication
...]
feb 13, 2017 4:51:56 AM org.hibernate.Version logVersion
INFO: HHH000412: Hibernate Core {5.2.7.Final}
feb 13, 2017 4:51:56 AM org.hibernate.cfg.Environment <clinit>
INFO: HHH000206: hibernate.properties not found
feb 13, 2017 4:51:57 AM org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit>
INFO: HCANN000001: Hibernate Commons Annotations {5.0.1.Final}
feb 13, 2017 4:51:57 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
WARN: HHH10001002: Using Hibernate built-in connection pool (not for production use!)
feb 13, 2017 4:51:57 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001005: using driver [com.mysql.jdbc.Driver] at URL [jdbc:mysql://localhost:3306/hibernate?zeroDateTimeBehavior=convertToNull]
feb 13, 2017 4:51:57 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001001: Connection properties: {user=root, password=****}
feb 13, 2017 4:51:57 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001003: Autocommit mode: false
feb 13, 2017 4:51:58 AM org.hibernate.engine.jdbc.connections.internal.PooledConnections <init>
INFO: HHH000115: Hibernate connection pool size: 20 (min=1)
feb 13, 2017 4:52:02 AM org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQL5InnoDBDialect
feb 13, 2017 4:52:06 AM org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl getIsolatedConnection
INFO: HHH10001501: Connection obtained from JdbcConnectionAccess [org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess@52a3ff] for (non-JTA) DDL execution was not in auto-commit mode; the Connection 'local transaction' will be committed and the Connection will be set into auto-commit mode.
问题是,我通常会通过eclipse链接做同样的事情,一切都会很好
这里是我的依赖项enter image description here
共 (0) 个答案