标签: java-ee-6

将JPA实体命名为"Group"是不合法的吗?

我正在开发一个JEE6应用程序,使用JPA 2.0和Hibernate 3.5.2-Final作为Provider(和MySQL 5.1.41).我的应用服务器是Glassfish V3.0.1.我已经有一个有一些实体和关系的工作CRUD应用程序.

现在我添加了一个名为"Group"的(非常简单的)实体.实体类看起来像这样:

package model
//Imports...
@Entity
public class Group {
  @Id @GeneratedValue
  private Long id;

  @NotNull
  private String name;

  //Getters and Setters
}
Run Code Online (Sandbox Code Playgroud)

当然我也把它添加到了persistence.xml中,就像<class>model.Group</class>.我的persistence.xml在部署时删除并重新创建所有表.

因此,当我部署应用程序时,将生成除我的表组之外的所有实体的表.在hibernate日志中,我发现了以下错误(这不会阻止部署应用程序)

[#|2010-06-30T11:54:29.862+0200|INFO|glassfish3.0.1|org.hibernate.cfg.AnnotationBinder|_ThreadID=11;_ThreadName=Thread-1;|Binding entity from annotated class: model.Group|#]
[#|2010-06-30T11:54:29.862+0200|INFO|glassfish3.0.1|org.hibernate.cfg.annotations.EntityBinder|_ThreadID=11;_ThreadName=Thread-1;|Bind entity model.Group on table Group|#]
[#|2010-06-30T11:54:33.773+0200|SEVERE|glassfish3.0.1|org.hibernate.tool.hbm2ddl.SchemaExport|_ThreadID=11;_ThreadName=Thread-1;|Unsuccessful: create table Group (id bigint not null auto_increment, name varchar(255) not null, primary key (id))|#]
[#|2010-06-30T11:54:33.773+0200|SEVERE|glassfish3.0.1|org.hibernate.tool.hbm2ddl.SchemaExport|_ThreadID=11;_ThreadName=Thread-1;|You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right …
Run Code Online (Sandbox Code Playgroud)

orm hibernate jpa java-ee-6 jpa-2.0

7
推荐指数
2
解决办法
2573
查看次数

EntityManager.find找不到实体,但使用Criteria API

我在Java EE 6中遇到了一个相当奇怪的情况,其中使用JPA EntityManager的find方法以及实体的主id返回null,但使用Criteria API选择具有该id的所有实体都可以正常工作.

这是我正在使用的代码find:

// Always returns null, even for records I know for sure are in there.
user = em.find(User.class, userId);
Run Code Online (Sandbox Code Playgroud)

...这里是我使用Criteria API的代码:

CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<User> criteria = builder.createQuery(User.class);
Root<User> u = criteria.from(User.class);
TypedQuery<User> query = em.createQuery(
    criteria.select(u).where(builder.equal(u.get("id"), userId)));
user = query.getSingleResult();
Run Code Online (Sandbox Code Playgroud)

任何想法为什么find返回null但Criteria找到用户?我在程序中的完全相同的位置尝试了这两种替代方法.

以下是User实体的相关部分:

@Entity
@Table(name = "USERS")
@Access(AccessType.PROPERTY)
public class User implements Serializable {
    ...
    private Long id;
    ...
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "user_id_generator")
    @SequenceGenerator(name = …
Run Code Online (Sandbox Code Playgroud)

hibernate java-ee criteria-api java-ee-6 jpa-2.0

7
推荐指数
1
解决办法
2万
查看次数

JEE6:@Resource注入了什么?

我试图找出,可以通过@Resource注释注入无状态会话Bean.我在哪里可以找到一份清单?它取决于容器(在我的例子中是Glassfish 3.1.1)吗?

dependency-injection java-ee java-ee-6

7
推荐指数
1
解决办法
4854
查看次数

@Asynchronous不会导致JBossAS7中EJB方法的异步调用

我正在努力弄清楚为什么我的EJB中的@Asynchronous方法实际上并没有异步调用.我正在使用CDI(带有beans.xml)在JBoss AS 7上运行JSF2项目,并使用Maven生成的简单.war包装.

EJB与.war一起打包,以及与之交互的JSF2托管bean.这是一个简单的@Stateless EJB.通过将它(通过@Inject)注入到调用其@Asynchronous方法的JSF2托管bean中来使用它.

而不是立即返回Future的@Asynchronous方法调用,它同步执行,就好像它是一个普通的未经代理的直接调用.无论我使用本地无接口视图还是本地业务接口来调用EJB,都是如此.

@Remote bean只支持@Asynchronous吗?如果是这样,它可以在.war包装中工作,还是我必须在EAR中打包EJB jar才能获得这个功能?

例如简化代码,每个类在.war中的同一个包中:

public interface SomeEJB {
  public Future<Void> doSomething();
}

@Stateless
@Local(SomeEJB.class)
public class SomeEJBImpl implements SomeEJB {

  @Asynchronous
  @Override
  public Future<Void> doSomething() {
    // Spend a while doing work
    // then:
    return new AsyncResult<Void>(null);
  }

}

@Named
@RequestScoped
public class JSFBean {

  @Inject private transient SomeEJB someEJB;
  private Future<Void> progress;

  // Called from JSF2, starts work and re-displays page
  public String startWorkAction() {
    // This call SHOULD return a Future immediately. …
Run Code Online (Sandbox Code Playgroud)

ejb java-ee java-ee-6 ejb-3.1 jboss7.x

7
推荐指数
1
解决办法
6201
查看次数

WELD-001408注入EntityManager时不满意的依赖关系

我有@Statelessbean实现两个接口(远程和本地).我还添加@LocalBean了用于通过无接口视图访问bean的anotation.

@Stateless
@LocalBean
public class WeatherDataBean implements WeatherDataBeanRemote, WeatherDataBeanLocal {
    @Inject
    private EntityManager entityManager;

    public WeatherDataBean () {

    }
    // ....attributes, getter & setter methods ....
}
Run Code Online (Sandbox Code Playgroud)

我使用@Inject这个原因取自JBoss AS7快速启动的这个例子:

我们使用来自CDI的"资源生成器"模式,将实体管理器的旧式@PersistenceContext注入"别名"为CDI样式注入.这允许我们在整个应用程序中使用一致的注入样式(@Inject).

以前我用过:

@PersistenceContext(unitName="WeatherStationJPA")
private EntityManager entityManager;
Run Code Online (Sandbox Code Playgroud)

在EJB中,它没有任何问题.但是使用@Inject注释我得到这个错误:

WELD-001408在注入点[[field] @Inject private ejb.WeatherDataBean.entityManager]中带有限定符[@Default]的[EntityManager]类型的不满意依赖项

这是我如何定义类资源:

public class Resources {
     @SuppressWarnings("unused")
     @PersistenceContext(unitName="WeatherStationJPA")
     @Produces
     private EntityManager entityManager;

     @Produces
     FacesContext getFacesContext() {
         return FacesContext.getCurrentInstance();
     }
}
Run Code Online (Sandbox Code Playgroud)

如果我尝试注入实体管理器,为什么会出现此错误?

编辑: 根据@LightGuard的请求,我正在添加我用来引用注释的包:

  1. WeatherDataBean有:

    import javax.ejb.LocalBean;
    import javax.ejb.Stateless;
    import javax.inject.Inject; …
    Run Code Online (Sandbox Code Playgroud)

dependency-injection stateless-session-bean entitymanager cdi java-ee-6

7
推荐指数
2
解决办法
2万
查看次数

在有状态EJB 3.1 bean中保持会话?

我正在尝试结合以下技术的Java webapp:

  • Java EE 6
  • CDI
  • JSF 2
  • EJB 3.1
  • 春季安全

我为我的JSF页面提供了基于CDI的后台bean(@ViewScoped,@ Name).

我使用@Stateless EJB bean来完成实际工作.

我只需要很少的会话信息,如jSessionCookie(由容器管理),内部用户名和一些其他内部ID.现在,我想知道在哪里放置这个会话信息,以便我可以在JSF的支持bean中访问它,还可以将它提供给无状态EJB?我应该使用@Stateful EJB会话bean还是应该使用@SessionScoped和@Named创建基于CDI的POJO?

有没有最佳做法?

java ejb java-ee java-ee-6 ejb-3.1

7
推荐指数
1
解决办法
4965
查看次数

会话过期后未调用@PreDestroy

这是在WAS8.0上运行的JSF 2应用程序.这是一个页面的"支持"bean的代码.

    @Named("mySessionBean")
    @SessionScoped
    @Stateful
    @LocalBean
    @StatefulTimeout(unit = TimeUnit.MINUTES, value = 10)
    public class MySessionBean implements Serializable {
        @PostConstruct
        public void init()
        {
             System.out.println("start MySessionBean: " + this.hashCode());
         }

        @PreDestroy
        public void cleanup()
        {
             System.out.println("destroy MySessionBean: " + this.hashCode());
         }
        ....
    }
Run Code Online (Sandbox Code Playgroud)

web.xml中设置的会话超时值小于bean的超时.当我运行应用程序时,我看到来自@PostConstruct的打印输出,但从未看到来自@PreDestroy的打印输出.我尝试了以下两种方案:1.logout - invalidateSession; 2.只需等到会话到期.

我不是应用程序的设计者.设计者坚持将所有支持bean作为有状态会话bean.我认为更主流的方法就是让它们成为CDI bean.但无论如何,当我确实将注释更改为CDI时,我也开始从@PreDestroy获取打印输出

    @Named("mySessionBean")
    @SessionScoped
    public class MySessionBean implements Serializable {
    .....
Run Code Online (Sandbox Code Playgroud)

我的问题是,在第一种情况下我没有得到@PreDestroy方法调用的原因是什么?如果我不能看到@PreDestroy被调用,在那里我可以跟踪"后盾" bean的生命周期(在这种情况下,有状态会话Bean)的任何其他方式.谢谢!

cdi java-ee-6 jsf-2 websphere-8

7
推荐指数
1
解决办法
6753
查看次数

JSF2.0 - 具有可选方法表达式的复合组件

我正在实现一个复合组件,我发现了一个我找不到解决方案的问题.

我指定了页面作者可以传递或不传递的属性,但我无法指定方法属性(Action的方法表达式),如果未传递,则复合组件不使用method属性在composite:implementation标签中.

这是我的代码:

<composite:interface>
    <composite:attribute name="namePrompt" required="true"/>
    <composite:attribute name="actionMethod" method-signature="java.lang.String  action()" required="false"/>
    <composite:attribute name="showComponent" default="false"/>
</composite:interface>

<composite:implementation>
    <div>
       <p:commandLink actionListener="#{cc.attrs.actionMethod}"
                      rendered="#{cc.attrs.showComponent}"
                      >
            <h:outputText value="#{cc.attrs.namePrompt}"/>    
       </p:commandLink>
    </div>
</composite:implementation>
Run Code Online (Sandbox Code Playgroud)

使用它时,我没有指定"actionMethod"属性.像这样:

<util:foo namePrompt="SomeName" showComponent="true"/>
Run Code Online (Sandbox Code Playgroud)

但我收到错误消息:

javax.faces.FacesException: Unable to resolve composite component from using page using EL expression '#{cc.attrs.actionMethod}'
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点?

composite-component java-ee-6 jsf-2

7
推荐指数
2
解决办法
8982
查看次数

何时有状态会话bean被销毁?

我是ejbs的新手,我想知道有状态会话bean是否会被销毁.我在servlet中注入了一个有状态会话bean.即使在30分钟后,我发现豆子是活跃的.我正在使用jboss eap 6.0.我相信HttpSession与有状态会话bean无关.我使HttpSession失效,以确保HttpSession与statful会话bean无关.那么,如果我的应用程序有很多用户,如果我创建一个新bean,那么我的服务器的性能就会降低.容器如何管理有状态会话bean.豆被移除或销毁的时间是什么时候?

我读过这篇文章和其他几篇文章.但我没有明白.

java stateful-session-bean ejb-3.0 java-ee-6

7
推荐指数
1
解决办法
3070
查看次数

JEE6 REST服务@AroundInvoke拦截器正在注入一个空的HttpServletRequest对象

我有一个@AroundInvoke REST Web服务拦截器,我想用它来记录常见数据,如类和方法,远程IP地址和响应时间.

使用InvocationContext获取类和方法名称很简单,只要被拦截的Rest服务在其参数列表中包含@Context HttpServletRequest,就可以通过HttpServletRequest获得远程IP.

但是有些REST方法的参数中没有HttpServletRequest,在这些情况下我无法弄清楚如何获取HttpServletRequest对象.

例如,以下REST Web服务没有@Context HttpServletRequest参数

@Inject
@Default
private MemberManager memberManager;

@POST
@Path("/add")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public Member add(NewMember member) throws MemberInvalidException {
    return memberManager.add(member);
}
Run Code Online (Sandbox Code Playgroud)

我已经尝试将它直接注入我的拦截器,但是(在JBoss 6.1上)它总是为空...

public class RestLoggedInterceptorImpl implements Serializable {
    @Context
    HttpServletRequest req;

    @AroundInvoke
    public Object aroundInvoke(InvocationContext ic) throws Exception {

        logger.info(req.getRemoteAddr());  // <- this throws NPE as req is always null
        ...
        return ic.proceed();
Run Code Online (Sandbox Code Playgroud)

我想建议一种可靠的方法来访问HttpServletRequest对象 - 甚至只是Http Headers ...无论REST服务是否包含参数.

jboss jax-rs interceptor java-ee-6 jboss-weld

6
推荐指数
2
解决办法
4432
查看次数