EJB JAR中的JPA转换器

时间:2014-08-10 09:37:32

标签: java jpa glassfish ejb

我正在尝试为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合作

1 个答案:

答案 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是数据库期望的varcharchartext类型字段。