在启用注入的同时创建新实体

时间:2011-06-01 23:22:47

标签: jpa ejb java-ee-6 cdi

我在无状态会话bean上有一个方法,它创建一个实体的新实例并保持它。您通常可以使用新的MyEntity()来创建对象,但我想注入以填充实体的一些属性。

我使用

获得了部分成功
@Inject 
@New 
private MyEntity myNewEntity; 

在会话bean中,然后在我的方法中使用该实例。

我现在遇到的问题是,第二次调用该方法时,myNewEntity不是新对象,它与第一次创建的对象相同。结果我得到了

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:键'PRIMARY'的重复条目'9'

或者至少这就是为什么我认为我得到了这个例外。当然,如果我使用新的MyEntity(),我不会得到异常,但我的注射不会发生。

我走错了路吗?如何在启用注入时创建新的本地实体对象?

任何帮助都会很棒!

2 个答案:

答案 0 :(得分:2)

首先 - 我严重怀疑使用CDI来控制实体的生命周期是个好主意。请参阅文档(here)中的引用:

  

根据这个定义,JPA   实体是技术管理的   豆子。但是,实体有他们的   拥有特殊的生命周期,状态和   身份模型通常是   由JPA实例化或使用新的。   因此我们不建议直接使用   注入实体类。我们   特别推荐不要分配   @Dependent以外的范围   实体类,因为JPA不能   坚持注入CDI代理。

创建实体的新实例应该做的是添加一个间接层,使用@Produces@Unwraps(Seam Solder,如果你需要真正的无状态),从而制作确保你明确地编码new

答案 1 :(得分:0)

我认为我现在有一个工作解决方案似乎没问题,虽然我不太清楚为什么会这样,所以我欢迎您就更好的解决方案提出反馈意见。我现在正在将一个DAO风格的bean注入我的无状态会话bean:

@Stateless
public class PhoneService {

    @Inject
    protected ProblemReports problemReports;

将我的实体注入ProblemReports bean:

public class ProblemReports {

    @Inject
    @New
    private ProblemReport newProblemReport;

我假设ProblemReports默认为@Dependant范围,据我所知,它应该与包含它的无状态会话bean相同。如果ProblemReports的范围更短,我可以理解这一点,导致在创建新的ProblemReports时创建一个新的ProblemReport实例;但事实并非如此。

这只是EJB和CDI不能很好地协作的一个例子吗?