Автоматически добавлять префикс к именам столбцов для классов @Embeddable - PullRequest
28 голосов
/ 15 июня 2010

Я разрабатываю проект, в котором я сохраняю некоторые POJO, добавляя аннотации Hibernate. Одна проблема, с которой я сталкиваюсь, заключается в том, что подобный код завершается ошибкой, поскольку Hibernate пытается отобразить подполя в пределах Time_T на один и тот же столбец (т. Е. startTime.sec и stopTime.sec оба пытаются сопоставить столбцу 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 такая возможность, или есть какой-то другой разумный обходной путь?

Ответы [ 4 ]

26 голосов
/ 15 июня 2010

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

10 голосов
/ 14 апреля 2017

В моем случае с 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
7 голосов
/ 15 июня 2010

Еще один способ решения этой проблемы - использование аннотаций @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.

0 голосов
/ 25 сентября 2018

spring.jpa.hibernate.naming.implicit-strategy = org.hibernate.boot.model.naming.ImplicitNamingStrategyComponentPathImpl spring.jpa.hibernate.naming.physical-стратегии = org.hibernate.boot.model.naming.PhysicalNamingImplS1001 *

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