Creating new entities while enabling injection

大憨熊 提交于 2019-12-11 05:56:49

问题


I have a method on a stateless session bean which creates a new instance of an entity and persists it. You might normally use new MyEntity() to create the object but I would like injection to populate some of the properties of the entity for me.

I got partial success using

@Inject 
@New 
private MyEntity myNewEntity; 

in the session bean and then using that instance in my method.

The problem I have now is that the second time the method is called, myNewEntity isn't a new object, its the same object as the one created the first time. As a result I'm getting

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '9' for key 'PRIMARY'

Or at least that's why I think I'm getting this exception. Certainly if I use new MyEntity() I don't get the exception but my injection doesn't happen.

Am I on the wrong track? How can I create a new local entity object while enabling injection?

Any help would be great!


回答1:


First of all - I have serious doubts that it's a good idea to use CDI to control the lifecycle of a Entity. See this quote from the documentation (here):

According to this definition, JPA entities are technically managed beans. However, entities have their own special lifecycle, state and identity model and are usually instantiated by JPA or using new. Therefore we don't recommend directly injecting an entity class. We especially recommend against assigning a scope other than @Dependent to an entity class, since JPA is not able to persist injected CDI proxies.

What you should do to create new instances of entities is adding a layer of indirection, either with @Produces or @Unwraps (Seam Solder, if you need it to be truly stateless), and thereby making sure that you code explicitly calls new.




回答2:


I think I have a working solution now which seems okay, though I'm not quite sure why it works so I welcome your feedback on a better solution. I am now injecting a DAO-style bean into my stateless session bean:

@Stateless
public class PhoneService {

    @Inject
    protected ProblemReports problemReports;

An injecting my entity into the ProblemReports bean:

public class ProblemReports {

    @Inject
    @New
    private ProblemReport newProblemReport;

I assume that ProblemReports defaults to @Dependant scope which as I understand it should be the same as the stateless session bean which containts it. I could understand this if the scope of ProblemReports was shorter, causing a new instance of ProblemReport to be created when the new ProblemReports is created; but it isn't.

Is this just an example of EJB and CDI not playing well together?



来源:https://stackoverflow.com/questions/6208850/creating-new-entities-while-enabling-injection

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!