Автоматическое добавление префикса в имена столбцов для классов @Embeddable

Я разрабатываю проект, в котором я сохраняю некоторые POJO, добавляя аннотации Hibernate. Одна из проблем, с которыми я столкнулся, заключается в том, что такой код не работает, поскольку Hibernate пытается сопоставить подполя в Time_T в одном столбце (т.е. startTime.sec и stopTime.sec оба пытаются сопоставить с colum sec, вызывая ошибку).

@Entity
public class ExampleClass
{
  @Id
  long eventId;

  Time_T startTime;
  Time_T stopTime;
}

@Embeddable
public class Time_T
{
  int sec;
  int nsec;
}

Поскольку в системе будет много таких событий, было бы неплохо, если бы была возможность автоматически добавлять префикс к имени столбца (например, сделать столбцы startTime_sec, startTime_nsec, stopTime_sec, stopTime_nsec), без необходимости применять переопределения для каждого поля. Имеет ли Hibernate эту возможность или существует ли какая-либо другая разумная работа?

Ответ 1

Попробуйте установить свойство hibernate.ejb.naming_strategy на org.hibernate.cfg.DefaultComponentSafeNamingStrategy

Ответ 2

Другим способом решения проблемы является использование @AttributeOverrides и @AttributeOverride аннотаций. В вашем примере свойство Time_T.sec отображается в столбце sec. Вы можете сопоставить ExampleClass следующим образом:

@Entity
public class ExampleClass {
    @Id
    long eventId;

    @AttributeOverrides(
        @AttributeOverride(name = "sec", column = @Column(name = "start_sec"))
    )
    Time_T startTime;
    Time_T stopTime;
}

Отображение результата startTime.sec <=> start_sec и stopTime.sec <=> sec. Конечно, вы могли бы использовать аннотации для создания более значимого имени для столбца stopTipe.sec.

Ответ 3

В моем случае с org.hibernate: hibernate-core: 5.0.12.Final и org.springframework.boot: spring -boot-starter-data-jpa: 1.5.2.RELEASE Мне пришлось сделать следующее свойства в файле application.properties:

spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyComponentPathImpl
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl