jakarta-ee-在启动singleton时使用JPA



我想在启动时使用JPA 2.1 eclipselink访问数据库。当它运行时,我在控制台日志中成功登录,但它抛出的表或视图不存在。然而,如果我通过rest服务调用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
   }
}

如果您想在bean初始化后调用doSomething,它将需要一个@PostConstruct。此外,如果您有依赖项,您需要在初始化该bean之前可用,那么您可以使用@DependsOn

这解决了我的问题。

如果使用JEE和JTA管理的实体管理器,指定代理用户和密码可能会更加困难,因为实体管理器和JDBC连接不受应用程序控制。只要在建立数据库连接之前完成,仍然可以在EntityManager对象上指定持久性单元属性。EclipseLink 解决方案指南

EDIT:确保在每次交易前设置

最新更新