2

所以我想总是使用我自己的扩展 Hibernate 的自定义类型StringType(也执行修剪和大写)。但是我在如何注册它时遇到了一些问题,所以它总是被使用而不是 default StringType,因为我不想把@Type注释放在每个字符串上。

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

4

1 回答 1

2

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 机制将其公开为服务提供者来注册。例如:

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

其中将包含以下内容:

com.example.CustomUserTypesIntegrator

对于这方面的参考,我建议查看Jadira 用户类型库是如何做到的:https ://github.com/JadiraOrg/jadira/ 。特别是,我发现他们的AbstractUserTypeHibernateIntegrator课程值得一看。

于 2014-02-03T01:14:30.640 回答