我使用 JPA 将我的数据保存到数据库中。具体来说,我使用 Hibernate 4.3.5 作为 JPA 实现。由于性能和保持表结构简单,我不会直接从对象 1:1 映射到表,而是一些我只保留为对象但不为其创建实体类的数据列表。取而代之的是,我将对象结构作为 JSON 序列化到数据库中。这种序列化/反序列化是用@Converter 完成的,而且效果很好。
简化代码:
@Entity
public class EntitySample {
...
@Convert(converter=ConverterSample.class)
private List<SampleObject> sampleList=new ArrayList<>();
private String name;
public List<SampleObject> getSampleList() {
return sampleList;
}
public void setName(String newName) {
name=newName;
}
...
}
@Converter
public class ConverterSample implements AttributeConverter<List,String> {
@Override
public String convertToDatabaseColumn(List data) {
return serializeToJSON(data);
}
@Override
public List convertToEntityAttribute(String data) {
return deserializeFromJSON(data);
}
...
}
Run Code Online (Sandbox Code Playgroud)
如上所述,它主要是有效的!我在单元测试中检测到以下问题:
// create a new entity object with list …Run Code Online (Sandbox Code Playgroud) 我有一个SessionScoped类.对于每个用户访问,我需要一个自己的这个类的实例.一切都很好,很长一段时间.但是现在我还需要从后端访问这些对象,而无需任何用户交互.我确实有一个无状态的企业bean,但每当我想访问会话作用域对象时,我都会得到一个例外.一个简单的示例代码如下:
@SessionScoped
public class SessionObj implements Serializable {
public String getValue() {
return "Hello World";
}
}
@Stateless
public class StatelessBean {
private static final Logger LOG=Logger.getLogger(StatelessBean.class);
@Inject
private SessionObj sessionObj;
public void test() {
LOG.info("session object: "+sessionObj);
LOG.info("Method call: "+sessionObj.getValue());
}
}
Run Code Online (Sandbox Code Playgroud)
但调用测试方法的结果如下:
12:19:10,484 ERROR [org.jboss.as.ejb3.tx.CMTTxInterceptor] (EJB default - 6) javax.ejb.EJBTransactionRolledbackException: WELD-001303 No active contexts for scope type javax.enterprise.context.SessionScoped
12:19:10,484 ERROR [org.jboss.ejb3.invocation] (EJB default - 6) JBAS014134: EJB Invocation failed on component StatelessBean for method public void package.StatelessBean.test(): javax.ejb.EJBTransactionRolledbackException: …Run Code Online (Sandbox Code Playgroud)