使用 Camel-Case 的 Hibernate 空属性值

Hibernate Null Attribute Value using Camel-Case

使用

Hibernate 5.3,Spring Boot 2.1,MySQL,在 Windows 10 OS.

中运行

我所知道的

我已经在我的 phpmyadmin 上验证了属性的大小写。只要大小写与我的实体 class 的属性相同,您就不必在该实体中显式定义列名。并且不需要使用 @Column(name="tableattribute")

问题

执行查询后,已正确检索到行数。例如,我的数据库包含5条记录,List包含5个员工对象,但实体的所有属性始终returns为空值。

我想删除在每个属性上显式声明列名并确保它在实际服务器中工作,这可能会导致列名和属性名的大小写出现问题。

尝试过

我尝试在每个属性上添加 @Column('column Name all lowercase') 并检索值。

学习后,我验证了table列是否为小写,但不是小写。相反,它仍然遵循我的 SQL 命令中的驼峰式大小写来创建 table.

MySQL Table

   CREATE TABLE `personal` (
   `empID` int(11) NOT NULL,
   `empNumber` varchar(15) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
   `surname` varchar(50) NOT NULL DEFAULT '',
   `firstname` varchar(50) NOT NULL DEFAULT '',
   `middlename` varchar(50) NOT NULL DEFAULT '',
   `middleInitial` varchar(10) DEFAULT NULL,
   `nameExtension` varchar(10) DEFAULT '',
   `salutation` varchar(15) NOT NULL DEFAULT ''
   ) ENGINE=MyISAM DEFAULT CHARSET=latin1;

实体

只要@Column 并以小写形式指定列名,该实体现在就可以正常工作。但是把每个属性都加上@Column并且指定字段名全部小写就很烦人了

  @Entity
  @Table(name="personal")
  public class Employee implements Serializable {
     @Id
     @Column(name="empID")
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     private long id;

     @NotNull
     @Column(name="empnumber")
     private String empNumber;

     private String surname;

     private String firstname;

     private String middlename;

     @Column(name="middleinitial")
     private String middleInitial;

     @Column(name="nameextension")
     private String nameExtension;
 }

DAO 上的实际查询片段

     @Autowired
     private EntityManager entityManager;

     @Override
     public List<Employee> findAll() {
          Session currentSession = entityManager.unwrap(Session.class);
          Query<Employee> query = currentSession.createQuery("from Employee", Employee.class);
          return query.getResultList();
     }

您可以通过设置

来更改该行为
spring.jpa.hibernate.naming.physical-strategy
spring.jpa.hibernate.naming.implicit-strategy

您的 application.properties 中的属性。关于如何自己实现策略,可以查看official docs

编辑 1:

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