我正在尝试为Joda-Time定义一个JPA @Converter
,它将放入EJB JAR以及JPA @Entity
和@Stateless
会话bean的结果,如下所示:
@Converter(autoApply = true) public class LocalDateConverter implements AttributeConverter<LocalDate, String> { @Override public String convertToDatabaseColumn(final LocalDate localDate) { if (localDate == null) { return null; } return localDate.toString(); } @Override public LocalDate convertToEntityAttribute(final String dbData) { if (dbData == null) { return null; } return LocalDate.parse(dbData); } }
我有一个看起来像这样的会话bean:
@Stateless @TransactionAttribute(TransactionAttributeType.REQUIRED) public class VenueTableModule { @PersistenceContext EntityManager em; public Bar foo() { final Bar bar = new Bar (); bar.name = "foo" + UUID.randomUUID(); bar.startDate = LocalDate.now(); em.persist(bar); em.flush(); return bar; } }当我从servlet调用它时,
在em.persist(bar)
行失败。代码在没有em.*
行的情况下工作当转换器,无状态会话bean等被移动到我知道允许的Web应用程序时,我没有得到错误,我可能不得不这样做。因此,似乎@Converter
使用的是与EJB jar的其余部分不同的类加载器。
我正在使用Glassfish 4.0,我不确定它是bug GLASSFISH-21161还是我只是做错了。但是,the code我似乎与WildFly合作
答案 0 :(得分:0)
AttributeConverter
是一个通用类型类。请参阅下面的Java Doc:
/**
* A class that implements this interface can be used to convert
* entity attribute state into database column representation
* and back again.
* Note that the X and Y types may be the same Java type.
*
* @param <X> the type of the entity attribute
* @param <Y> the type of the database column
*/
public interface AttributeConverter<X,Y>
尝试将LocalDateConverter更改为
public class LocalDateConverter implements AttributeConverter<LocalDate, String>
其中LocalDate
是实体bean中属性的类型,String
是数据库期望的varchar
或char
或text
类型字段。