代码之家  ›  专栏  ›  技术社区  ›  VeeArr

自动为@embeddable classes的列名添加前缀

  •  28
  • VeeArr  · 技术社区  · 14 年前

    我正在开发一个项目,在这个项目中,我通过添加Hibernate注释来持久化一些POJO。我遇到的一个问题是这样的代码失败,因为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 回复  |  直到 6 年前
        1
  •  24
  •   Bozho    14 年前

    尝试设置属性 hibernate.ejb.naming_strategy org.hibernate.cfg.DefaultComponentSafeNamingStrategy

        2
  •  9
  •   Farrukh Najmi    7 年前

    对于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
    
        3
  •  6
  •   Matheus Moreira    14 年前

    另一种解决问题的方法是使用@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 列。

        4
  •  -2
  •   Prabir Palai    6 年前

    spring.jpa.hibernate.naming.implicit strategy=org.hibernate.boot.model.naming.implicitNamingstrategycomponentpathImpl spring.jpa.hibernate.naming.physical strategy=org.hibernate.boot.model.naming.physicalNamingstrategyStandardIMPL