在启动单例上使用JPA

时间:2016-07-26 15:57:03

标签: java-ee weblogic12c jpa-2.1

我想在启动时使用JPA 2.1 eclipselink访问数据库。当它运行时,我在控制台日志中成功登录但它抛出表或视图不存在。但是,如果我通过休息服务在servlet中调用我的dao,一切运行正常。我错过了什么吗?

public abstract class BaseDao {
   @PersistenceContext(unitName = "myUnit")
   protected EntityManager em;
   public void create(Object entity);
   public Ojbect get();
}

@Stateless
public class MyDaoService extends BaseDao {
   @Override
   public void create(Object entity) {
      this.em.persit(entity);
   }
   // ...
}

@Singleton
@Startup
public class MySingleton{
   @EJB
   private MyDaoService service;
   @Schedule(hours="*", minutes="*", seconds="*/30")
   public void doSomething() {
      MyEntity entity = new MyEntity();//assumed I have entity object
      entity.setFirstName("firstName");
      entity.setLastName("lastName");
      service.create(entity); // >>>Table or view does not exist exception
   }
}

2 个答案:

答案 0 :(得分:0)

如果要在初始化bean之后调用它,doSomething将需要@PostConstruct。此外,如果你有依赖关系,你需要在初始化bean之前可用,然后你可以使用@DependsOn

答案 1 :(得分:0)

这解决了我的问题。

  

如果使用JEE和JTA管理实体管理器,则指定代理用户和密码可能会更困难,因为实体管理器和JDBC连接不在应用程序控制之下。只要在建立数据库连接之前完成此操作,仍可以在EntityManager对象上指定持久性单元属性。 EclipseLink Solutions Guide for EclipseLink

编辑:确保在每笔交易之前设置它