Ответ 1
Попробуйте установить свойство hibernate.ejb.naming_strategy
на org.hibernate.cfg.DefaultComponentSafeNamingStrategy
Я разрабатываю проект, в котором я сохраняю некоторые 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 эту возможность или существует ли какая-либо другая разумная работа?
Попробуйте установить свойство hibernate.ejb.naming_strategy
на org.hibernate.cfg.DefaultComponentSafeNamingStrategy
Другим способом решения проблемы является использование @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
.
В моем случае с 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