Как глобально сопоставить типы Java с типами пользователей и типами баз данных? - PullRequest
0 голосов
/ 31 октября 2019

Учитывая этот класс:

@javax.persistence.Entity
public class MyEntity {

    @org.hibernate.annotations.Type(type = "mypackage.MyJavaTypeAsMyDatabaseTypeUserType")
    @javax.persistence.Column(columnDefinition = "my_database_type")
    public MyJavaType foo;
}

Как можно избежать явного аннотирования каждого поля типа MyJavaType, как я аннотировал MyEntity.foo? Другими словами, как я могу глобально определить, что все поля MyJavaType во всех постоянных типах сохраняются с использованием MyJavaTypeAsMyDatabaseTypeUserType и my_database_type?


Ответы [ 3 ]

1 голос
/ 31 октября 2019

Определяя глобальный конвертер

@Converter(autoApply=true)
public class MyJavaConverter implements AttributeConverter<MyJavaType,MyJavaTypeAsMyDatabaseTypeUserType> {
public MyJavaTypeAsMyDatabaseTypeUserType convertToDatabaseColumn (MyJavaType attrib) {
return someConversionMethod(attrib);
}
public MyJavaType convertToEntityAttribute (MyJavaTypeAsMyDatabaseTypeUserType dbData) {
return someConversionMethod2(dbData);
}
}
1 голос
/ 01 ноября 2019

Не совсем глобальный, но достаточно глобальный для большинства случаев использования:

package-info.java:

@TypeDef(
    defaultForType = MyJavaType.class, 
    typeClass = mypackage.MyJavaTypeAsMyDatabaseTypeUserType.class
)
package mypackage.domain.model; // Contains MyEntity

Обратите внимание, что это решение исключает использование @org.hibernate.annotations.Type, а не@javax.persistence.Column.

1 голос
/ 31 октября 2019

Если у вас есть возможность использования SessionFactory, вы можете использовать следующую последовательность загрузки:

    StandardServiceRegistry serviceRegistry =
        new StandardServiceRegistryBuilder().configure("hibernate.cfg.xml").build();

    MetadataSources metadataSources = new MetadataSources(serviceRegistry);

    MetadataBuilder metadataBuilder = metadataSources.getMetadataBuilder();

    metadataBuilder.applyTypes(
        new TypeContributor() {

          @Override
          public void contribute(
              TypeContributions typeContributions, ServiceRegistry serviceRegistry) {
            typeContributions.contributeType(
                new MyJavaTypeAsMyDatabaseTypeUserType(), new String[] {MyJavaType.class.getName()});
          }
        });

    Metadata metadata = metadataBuilder.build();

    SessionFactory sessionFactory = metadata.buildSessionFactory();

Обратите внимание, что это решение исключает использование только @org.hibernate.annotations.Type, а не @javax.persistence.Column.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...