如何在Eclipse中使用Hibernate Tools生成DAO?

时间:2011-08-31 00:01:00

标签: java eclipse hibernate java-ee hibernate-tools

我正在使用: Eclipse Java EE IDE Web开发人员 版本:Indigo发布

使用hibernate工具,我是Eclipse中的hibernate的新手,所以我学习了如何配置hibernate并使用注释生成POJO(我认为它优于.xml)。

因此,在生成我的POJO和DAO之后,我尝试进行插入,但是向我的实体管理器启动了“空点异常”,这就是hibernate工具生成dao类的方式:

尝试使用生成的DAO:

public static void main(String[] args) {
// TODO Auto-generated method stub
    User user = new User();
    user.setEmail("valter@brainset.com.br");
    user.setPassword("123456");
    user.setReputation(0);

    DaoUser daoUser = new DaoUser();
    daoUser.persist(user);
}

DAO生成:

package com.example.pojo;

// Generated 30/08/2011 20:43:29 by Hibernate Tools 3.4.0.CR1

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * Home object for domain model class User.
 * @see com.example.pojo.User
 * @author Hibernate Tools
 */
@Stateless
public class UserHome {

    private static final Log log = LogFactory.getLog(UserHome.class);

    @PersistenceContext
    private EntityManager entityManager;

    public void persist(User transientInstance) {
        log.debug("persisting User instance");
        try {
            entityManager.persist(transientInstance);
            log.debug("persist successful");
        } catch (RuntimeException re) {
            log.error("persist failed", re);
            throw re;
        }
    }

    public void remove(User persistentInstance) {
        log.debug("removing User instance");
        try {
            entityManager.remove(persistentInstance);
            log.debug("remove successful");
        } catch (RuntimeException re) {
            log.error("remove failed", re);
            throw re;
        }
    }

    public User merge(User detachedInstance) {
        log.debug("merging User instance");
        try {
            User result = entityManager.merge(detachedInstance);
            log.debug("merge successful");
            return result;
        } catch (RuntimeException re) {
            log.error("merge failed", re);
            throw re;
        }
    }

    public User findById(Integer id) {
        log.debug("getting User instance with id: " + id);
        try {
            User instance = entityManager.find(User.class, id);
            log.debug("get successful");
            return instance;
        } catch (RuntimeException re) {
            log.error("get failed", re);
            throw re;
        }
    }
}

我认为我必须在配置过程中做错事。 我应该如何正确设置我的课程和dao's?

1 个答案:

答案 0 :(得分:4)

你是如何注入实体经理的?从它的外观来看,您正试图在SE中运行企业应用程序。

如果你真的需要在SE中运行(因此是“主”方法),你需要以某种方式引导持久性引擎。

我通常向实体管理器提供一个setter或提供一个抽象的getter。从那里你可以做这样的事情:

    _entityManagerFactory = Persistence.createEntityManagerFactory( "myJDBC" );
    _entityManager = _entityManagerFactory.createEntityManager();

    UserHome userHome = new UserHome();
    userHome.setEntityManger( _entityManager );

你还需要一个peristence.xml文件,其中一个持久性单元匹配你最终调用“myJDBC”的内容。

我希望这会有所帮助。

编辑#1

我认为有一个例子here会帮助你。它是JPA,Toplink和MySQL的helloworld,虽然MySQL部分无关紧要,但如果需要,你可以切换你的驱动程序。

编辑#2

还有一个仅使用hibernate的示例here(而不是JPA)。

编辑#3

我认为企业Eclipse工具中的hibernate工具的输出是针对:enterprise java。话虽这么说,拿走你拥有的东西并在EE中运行它要容易得多。这并不是说你不能在SE中运行它,只是它更具挑战性。

就这一点而言,每当我在不使用JPA的SE中使用hibernate时,我会使用Spring来增加它 - 这会显着降低负载。在你开始工作之前我不会担心,但是一旦你学到了一些关于hibernate和\或JPA的课程,我就会考虑一下。