Hibernate: How to configure EntityManager in sleep mode?

I am creating a hibernate project using the "hibernate tools" provided by JBoss for Eclipse. Generated Objects (POJO) and then DAO.

This method, for example:

@Entity @Table(name = "area", catalog = "project_schema", uniqueConstraints = @UniqueConstraint(columnNames = "area")) public class Area implements java.io.Serializable { private Integer id; private String area; public Area() { } public Area(String area) { this.area = area; } @Id @GeneratedValue(strategy = IDENTITY) @Column(name = "id", unique = true, nullable = false) public Integer getId() { return this.id; } public void setId(Integer id) { this.id = id; } @Column(name = "area", unique = true, nullable = false, length = 45) public String getArea() { return this.area; } public void setArea(String area) { this.area = area; } } 

And then the respected DAO class (generated by Hibernate Tools too):

 @Stateless public class AreaHome { private static final Log log = LogFactory.getLog(AreaHome.class); @PersistenceContext private EntityManager entityManager; public void persist(Area transientInstance) { log.debug("persisting Area instance"); try { entityManager.persist(transientInstance); log.debug("persist successful"); } catch (RuntimeException re) { log.error("persist failed", re); throw re; } } public void remove(Area persistentInstance) { log.debug("removing Area instance"); try { entityManager.remove(persistentInstance); log.debug("remove successful"); } catch (RuntimeException re) { log.error("remove failed", re); throw re; } } public Area merge(Area detachedInstance) { log.debug("merging Area instance"); try { Area result = entityManager.merge(detachedInstance); log.debug("merge successful"); return result; } catch (RuntimeException re) { log.error("merge failed", re); throw re; } } public Area findById(Integer id) { log.debug("getting Area instance with id: " + id); try { Area instance = entityManager.find(Area.class, id); log.debug("get successful"); return instance; } catch (RuntimeException re) { log.error("get failed", re); throw re; } } } 

But when I try to call AreaHome.persist() , it AreaHome.persist() 'NullPointerException' exception.

I am setting up my project using hibernate.cfg.xml and everything works fine:

 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.password"><password></property> <property name="hibernate.connection.url">jdbc:mysql://<hostname>:3306/<schema></property> <property name="hibernate.connection.username">root</property> <!-- <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> --> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <!-- SQL --> <property name="hibernate.format_sql">true</property> <property name="hibernate.show_sql">true</property> <!-- C3P0 --> <property name="hibernate.c3p0.acquire_increment">2</property> <property name="hibernate.c3p0.max_size">20</property> <property name="hibernate.c3p0.min_size">5</property> <property name="hibernate.c3p0.timeout">180</property> <property name="hibernate.c3p0.idle_test_period">100</property> <!-- Classes --> <mapping class="com.suaparte.pojo.Area" /> </session-factory> </hibernate-configuration> 

This works fine when I try:

 public void persist(Area area) throws ExceptionHandler { Session session = HibernateUtil.getSessionFactory().openSession(); try { session.beginTransaction(); session.save(area); session.getTransaction().commit(); } catch (HibernateException he) { session.getTransaction().rollback(); throw new ExceptionHandler(he.getCause()); } finally { if (session != null) { session.close(); } } } 

But I want to use the DAO generated using the Hibernate Tools, because they have an EntityManager (which is supposed to be introduced, but not obvious).

What should I do? Any ideas? Sorry for the long question, but I want to be very clear about my problem.

+6
source share
1 answer

Actually you need to implement EntityManagerFactory.

Create a persistence.xml file that is located in the META-INF folder.

Take a look at an example

http://docs.jboss.org/hibernate/entitymanager/3.6/reference/en/html_single/#setup-configuration-packaging

after the commands to create the EntityManagerFactory and EntityManager, then:

 EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("JavaStackOver"); EntityManager entityManager = entityManagerFactory.createEntityManager(); 

Allow dependencies, I used maven:

 <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>4.0.1.Final</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> <version>4.0.1.Final</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-annotations</artifactId> <version>3.5.6-Final</version> </dependency> 

Insert JPA and Done into your Tao!

The advantage of working with EntityManager is that you can modify Hibernate in futuro. Otherwise, you can use the session.

+3
source

Source: https://habr.com/ru/post/897611/


All Articles