如何在使用JPA + Hibernate时注册自定义String UserType

时间:2013-11-07 14:39:40

标签: java hibernate jpa

所以我想总是使用我自己的自定义类型来扩展Hibernate StringType(也执行修剪和大写)。但是我有一些关于如何注册它的问题因此总是使用它而不是默认的StringType,因为我不想在每个String上放置@Type注释。

当我只使用Hibernate时,我知道我可以使用registerTypeOverridehbm.cfg.xml在配置中注册它,但是如何在将Hibernate与JPA2结合使用时实现这一点? (注意:我知道@pavertor在jpa 2.1中有auto = true,但我必须使用的AS不支持JPA2.1)

1 个答案:

答案 0 :(得分:0)

Hibernate提供了可用于此的Integrator接口。例如:

public class CustomUserTypesIntegrator implements Integrator {
    public void integrate(Configuration configuration,
            SessionFactoryImplementor sessionFactory,
            SessionFactoryServiceRegistry serviceRegistry) {
        // Register the custom user type mapping(s) with Hibernate.
        CustomUserType customUserType = new CustomUserType();
        configuration.registerTypeOverride(customUserType,
                new String[] { customUserType.returnedClass().getName() });
    }

    public void integrate(MetadataImplementor metadata,
            SessionFactoryImplementor sessionFactory,
            SessionFactoryServiceRegistry serviceRegistry) {
        // Nothing to do here.
    }

    public void disintegrate(SessionFactoryImplementor sessionFactory,
            SessionFactoryServiceRegistry serviceRegistry) {
        // Nothing to do here.
    }
}

然后需要通过Java的标准SPI机制将其公开为Service Provider来注册。例如:

my-project/
  src/main/resources/
    META-INF/
      services/
        org.hibernate.integrator.spi.Integrator

其中包含以下内容:

com.example.CustomUserTypesIntegrator

有关此问题的参考,我建议您查看Jadira Usertype library如何执行此操作:https://github.com/JadiraOrg/jadira/。特别是,我发现他们的AbstractUserTypeHibernateIntegrator课程值得一看。