我在无状态会话bean上有一个方法,它创建一个实体的新实例并保持它。您通常可以使用新的MyEntity()来创建对象,但我想注入以填充实体的一些属性。
我使用
获得了部分成功@Inject
@New
private MyEntity myNewEntity;
在会话bean中,然后在我的方法中使用该实例。
我现在遇到的问题是,第二次调用该方法时,myNewEntity不是新对象,它与第一次创建的对象相同。结果我得到了
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:键'PRIMARY'的重复条目'9'
或者至少这就是为什么我认为我得到了这个例外。当然,如果我使用新的MyEntity(),我不会得到异常,但我的注射不会发生。
我走错了路吗?如何在启用注入时创建新的本地实体对象?
任何帮助都会很棒!
答案 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不能很好地协作的一个例子吗?