Java 自动为@Embeddeble类的列名添加前缀

Java 自动为@Embeddeble类的列名添加前缀,java,hibernate,orm,Java,Hibernate,Orm,我正在开发一个项目,通过添加Hibernate注释来持久化一些POJO。我遇到的一个问题是这样的代码失败了,因为Hibernate试图将时间内的子字段映射到同一列(即startTime.sec和stopTime.sec都试图映射到列sec,从而导致错误) 由于在整个系统中会出现很多类似的情况,如果有一个选项可以自动在列名后面添加前缀(例如,将列设置为startTime\u sec,startTime\u nsec,stopTime\u sec,stopTime\u nsec),无需基于每个字段应

我正在开发一个项目,通过添加Hibernate注释来持久化一些POJO。我遇到的一个问题是这样的代码失败了,因为Hibernate试图将
时间内的子字段映射到同一列(即
startTime.sec
stopTime.sec
都试图映射到列
sec
,从而导致错误)


由于在整个系统中会出现很多类似的情况,如果有一个选项可以自动在列名后面添加前缀(例如,将列设置为
startTime\u sec
startTime\u nsec
stopTime\u sec
stopTime\u nsec
),无需基于每个字段应用覆盖。Hibernate是否具有此功能,或者是否有其他合理的解决方法?

尝试将属性
Hibernate.ejb.naming_strategy
设置为
org.Hibernate.cfg.DefaultComponentSafeNamingStrategy
另一种解决问题的方法是使用@AttributeOverrides和@AttributeOverride注释。在您的示例中,
Time\u.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
。当然,您可以使用注释为
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

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

这显然是我不想做的,因为在整个代码中可能有很多这种模式的实例。我不想在
@AttributeOverrides
注释中添加数百次。很抱歉,我没有对您的第一条消息给予足够的关注。您明确表示不希望手动重写字段。下面的线程可能有答案:Hibernate 5将命名策略拆分为隐式部分(当未给出显式列重写时)和物理部分,物理部分甚至在使用列批注显式定义时也会重写任何命名。有一个默认的隐式命名策略可用,它作为嵌入类的前缀:
hibernate.implicit\u naming\u strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyComponentPathImpl
另请参见[hibernate documentation][1]了解更多详细信息[1]:如果我已经在使用自定义命名策略,该怎么办?是否有一个特定的方法可以使用此策略中的方法进行重写?@MattiasMartens您可以通过提供实现并对其进行配置来实现这一点。我必须在Spring引导的上下文中这样做,默认情况下使用
SpringImplicitNamingStrategy
。这使我无法切换到
ImplicitNamingStrategyComponentPathImpl
,然后使用spring boot的impl对其进行子分类并重写
public Identifier determinateJointableName(implicitJointTableNameSource source)
spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyComponentPathImpl
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl