JPA列具有不正确的下划线

时间:2015-02-16 15:15:46

标签: java spring hibernate jpa jdbc

我使用JPA进行数据库访问,并使用正确的名称对每列进行注释。现在,如果我执行查询(例如findAll()),则返回

Unknown column 'program0_.program_id' in 'field list'

错误消息正确program_id未知,因为真实姓名为programId

模特:计划

  @Entity
  @Table(name = "programs")
  @XmlRootElement
  public class Program implements Serializable {
          @Id
          @GeneratedValue(strategy = GenerationType.IDENTITY)
          @Basic(optional = false)
          @Column(name = "programId")
          private Long programId;
          @ManyToMany
          @JoinTable(
                  name = "programlabels",
                  joinColumns = {
                    @JoinColumn(name = "program", referencedColumnName = "programId")},
                  inverseJoinColumns = {
                    @JoinColumn(name = "label", referencedColumnName = "labelId")})
          private Collection<Label> labels;
        }

标签

@Entity
@Table(name = "labels")
@XmlRootElement
public class Label implements Serializable {
  @Id
  @Basic(optional = false)
  @NotNull
  @Size(min = 1, max = 100)
  @Column(name = "labelId")
  private String labelId;  
}

查询

select program0_.program_id as program_1_5_, ...

为什么JPA会将“programId”更改为“program_id”或者我是否缺少任何配置?

感谢

编辑:哦抱歉忘了添加查询代码/信息。

我使用Spring Data的JpaRepository界面并尝试findAll()查询。

@Repository
public interface ProgramRepository extends JpaRepository<Program, Long> {}

4 个答案:

答案 0 :(得分:16)

http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html

spring.jpa.hibernate.naming.strategy不是使用Hibernate 5进行Spring JPA实现的受支持属性。

application.properties

中使用以下属性
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

答案 1 :(得分:13)

正如spring-boot-jpa-column-name-annotation-ignored中所述,您的列名正在转换为蛇案例。

可能的解决方案:

  • 设置命名策略
  • 在注释中使用小写列名称

答案 2 :(得分:1)

能够映射

@Column(name =“ PersonFullName”)

私有字符串PersonFullName;


到数据库表列名“ PersonFullName ”,不带下划线。

以下内容对我有用。将其添加到应用程序设置中,然后使用@Column指定模型属性的物理数据库列名称。

@Column(name =“ PersonFullName”)

Application.properties

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

答案 3 :(得分:1)

在application.properties中使用以下内容

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