Tag: ejb 3.0

使用本地EJB,在同一个Container但不同的耳朵

我正在试图在同一个Glassfish中使用本地EJB,但不同的耳朵。 但Glassfish无法找到本地EJB或无法使用 我读到了这一点: 根据JavaEE教程,@ Local bean的客户端必须在与它访问的企业bean相同的JVM中运行。 在第一只耳朵中 ,我在jar中有本地接口 @Local public interface MyLocalBean { int getNumber(int num3); } 在另一个jar中,我有实现 @Stateless @LocalBean public class MyLocalBeanImpl implements MyLocalBean,Serializable{ public MyLocalBeanImpl() {} public int getNumber(int num3){…… 在第二只耳朵中 ,在同一条Glassfish中 我在jar里面有本地接口 @Local public interface MyLocalBean { int getNumber(int num3); } 在另一个jar子里,我有消费者 @Stateless @LocalBean public class BeanConsumer{ @EJB(name=”MyLocalBeanImpl”) private MyLocalBean beanlocal; 使用@EJB和(name […]

不再使用EJB 3.0的主要原因?

场景 您已使用EJB版本3开发了一个webapp。 系统已部署,交付并由客户使用。 如果您必须从头开始重写系统,您会再次使用EJB吗? 是的 :不要回答这个问题,而是回答这个问题。 否 :根据您的个人经验,提供不再使用EJB的主要原因。 让答案只包含一个原因。 这将让其他读者投票支持远离EJB 3的首要原因。

在没有注释的情况下将Hibernate迁移到JPA

我有一个大型的非Java EE,基于JSF的Web应用程序项目。 我们的系统是分层的(在源代码意义上):有一个数据模型包,在此基础上是DAO包。 我们在DAO包中专门使用Hibernate的XML配置映射。 我们真的不想用注释来混淆数据模型,但并没有专门与Hibernate结合(除了映射非常复杂)。 我强烈考虑转向Java EE并将DAO对象构建为EJB。 但是由于我们不愿意放弃Hibernate的XML,这引出了几个问题: 是否可以在模型中使用带有JPA注释的Hibernate而不使用JPA注释? 如果没有,我的EJB是否有可能在Hibernate上以事务方式运行? 我认为这称为JTA支持,但不确定。 我喜欢“免费”获取交易的想法; 现在我们有一个自定义编码的阶段监听器,我想删除哪个处理Hibernate事务。 有没有办法从Hibernate的XML映射配置迁移到某种JPA XML映射? 我没有看到这样做的方法,但显然减少我们与Hibernate的耦合会更好。 谢谢!

inheritance类注释

有没有办法让类inheritance超类的注释? 例如 @ApplicationException(rollback=true) public abstract class AbstractBeanActionException extends Exception { /* method body is simply calls to super() */ } public class OrderBeanException extends AbstractBeanActionException { /* does this class have to be annotated as well ? */ }

在注入点使用限定符的类型的不满意依赖(使用带有CDI的@Stateful EJB)

我有以下代码来管理两种存储库。 两个存储库类都inheritance了一个接口,以允许重新初始化其资源。 public interface CachingRepository { public void invalidateCache(); } 全局,应用程序范围的回购: @Named(“globalRepo”) @ApplicationScoped public class GlobalRepository implements CachingRepository { private List categories; … @Override public void invalidateCache() { categories = null; } … } 每个用户,会话范围的回购: @Named(“userRepo”) @SessionScoped //@Stateful // <- NOTE HERE public class UserRepository implements CachingRepository, Serializable { private List files; @Override public void […]

EJB工厂类

我正在尝试创建一个EJB工厂类,其工作原理如下:您有一个方法,它将EJB的一个类作为参数,然后检查EJB是否具有远程接口(如果不是抛出exception),如果它它会返回相关的EJB。 下面的代码就是这样做的。 但是它返回的对象是相关bean的远程接口的类型,而不是bean本身的类型。 我怎么能改变这个? 有没有办法告诉Javagenerics类型T与传递给方法的类的类型相同。 import java.util.Properties; import javax.ejb.Remote; import javax.ejb.Stateless; import javax.naming.*; public class EJBFactory { private InitialContext ctx; public EJBFactory() throws NamingException { ctx = new InitialContext(); } public EJBFactory(String host, String port) throws NamingException { Properties props = new Properties(); props.setProperty(“org.omg.CORBA.ORBInitialHost”, host); props.setProperty(“org.omg.CORBA.ORBInitialPort”, port); ctx = new InitialContext(props); } . // To […]

要求在REQUIRES_NEW内的REQUIRES_NEW内……等等

JBoss 4.x EJB 3.0 我见过如下代码(大大缩写): @Stateless @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED) public class EJB1 implements IEJB1 { @EJB private IEJB1 self; @EJB private IEJB2 ejb2; @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) public boolean someMethod1() { return someMethod2(); } @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) public boolean someMethod2() { return self.someMethod3(); } @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) public boolean someMethod3() { return ejb2.someMethod1(); } } 并且说EJB2几乎是EJB1的精确副本(相同的三种方法), EJB2.someMethod3()调用EJB3.someMethod1() ,然后最终在EJB3.someMethod3()写入DB。 这是一个人为的例子,但在我们的代码库中看到了类似的代码。 代码实际上工作得很好。 但是,这感觉就像是一种糟糕的做法,我担心@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)在每个甚至没有实际执行任何数据库写入的方法上。 这是否实际上每次为每个方法调用创建一个新事务,结果为: 新交易 – […]

如何在群集环境中使用javax.ejb.Singleton?

我需要在应用程序中维护一个对于集群环境中的所有用户和所有节点都是唯一的简单计数器。 我想过如下使用单例会话bean注释javax.ejb.Singleton: package foo; import javax.ejb.Singleton; @Singleton public class Bean { private int counter; […] } 这看起来很简单,但如果在集群环境中按预期工作,我找不到答案。 群集的每个节点都有自己的实例吗? 当然,我可以将bean保存在数据库中,但它实际上只是一个计数器,这样做会有点过分。 此外,我希望计数器在应用程序崩溃或重新启动时重置,因此持久存在会产生比解决的问题更多的问题。

EJB3 bean可以“自我注入”并通过EJB容器调用自己的方法吗?

是否可以“自我注入”EJB以便将本地方法作为bean方法调用? 在某些情况下,这可能是有利的,例如,如果使用容器管理的事务,并且应该在新事务中完成某些事务。 这是如何工作的一个例子: Foo.java: @Local public interface FoO { public void doSomething(); public void processWithNewTransaction(); // this should actually be private } FooBean.java: @Stateless public class FooBean implements Foo { @EJB private Foo foo; public void doSomething() { … foo.processWithNewTransaction(); … } @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) public void processWithNewTransaction() { … } } 如果我将processWithNewTransaction()提取到另一个bean,它将需要在接口中作为公共方法公开,即使它只应由FooBean 。 (同样的问题在于我的代码,这就是为什么在接口定义中有注释。) 一种解决方案是切换到bean管理的事务。 但是,这需要更改整个bean来管理自己的事务,并且会为所有方法添加大量的样板。

命名查询或本机查询或查询哪一个在性能上更好?

以下哪一个更好(EJB 3 JPA) //查询 一个)。 getEntityManager()。createQuery (“select o from User o”); //命名查询,其中findAllUser在实体级别定义 B)。 getEntityManager()。createNamedQuery (“User.findAllUser”); ** //原生查询 C)。 getEntityManager()。createNativeQuery (“SELECT * FROM TBLMUSER”); 请解释一下哪种方法哪种方法更好?