【问题标题】:Hibernate Null Attribute Value using Camel-Case使用 Camel-Case 的 Hibernate Null 属性值
【发布时间】:2020-01-06 22:34:59
【问题描述】:

使用

在 Windows 10 操作系统中运行的 Hibernate 5.3、Spring Boot 2.1、MySQL。

我知道的

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

问题

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

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

试过

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

在了解到这一点后,我验证了表格列是否为小写,但不是小写。相反,它仍然按照我的 SQL 命令中的驼峰式大小写来创建表。

MySQL 表

   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();
     }

【问题讨论】:

  • 有getter、setter、toString、equals等方法。我只是没有在我发布的代码中包含方法。

标签: java sql spring spring-boot jpql


【解决方案1】:

你可以通过设置来改变这种行为

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

【讨论】:

  • 好的。谢谢。这很好用。我刚刚结束为策略添加值,并使用休眠的默认类来检查它是否有效。它工作正常。这是我使用 maven 在应用程序属性上添加的代码:spring.jpa.hibernate.naming.physical-strategy = org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl spring.jpa.hibernate.naming.implicit-strategy = org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl
猜你喜欢
  • 2016-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多