Android应用调用REST服务存数据报错:Hibernate属性解析失败
我来帮你排查这个Hibernate的属性解析错误,结合你的情况来看,大概率是实体类和数据库字段的映射出了问题,给你几个针对性的排查和解决方向:
检查实体类属性与数据库字段的映射匹配度
你提到数据库字段是LINE_TYPE(注意末尾带有空格),而逆向生成的实体类可能没处理这个特殊情况。Hibernate默认是基于实体类属性名来解析HQL/JPQL的,不会自动识别带空格的数据库字段。
解决方案:在实体类对应的属性上显式添加@Column注解,指定带空格的字段名(Oracle中带特殊字符或空格的字段需要用双引号包裹,所以在Java注解里要转义双引号):@Column(name = "\"LINE_TYPE \"") private String lineType; // 这里的属性名可以根据你的实体类命名规范调整,比如line_type也可以检查HQL/JPQL查询语句中的属性名
错误提示找不到line_type,要确认你的查询语句里写的是数据库字段名还是实体类属性名。HQL是面向实体类的,必须使用实体类的属性名,而不是数据库字段名。比如如果实体类属性是lineType,但查询里写了line_type,就会报错,这时候要把查询语句里的line_type改成实体类对应的属性名。对比两个项目的Hibernate配置差异
你之前的应用能成功,现在的项目失败,要检查两个项目的Hibernate命名策略配置是否一致。比如是否使用了不同的物理命名策略(比如SpringPhysicalNamingStrategy和DefaultNamingStrategy的转换规则不同),如果当前项目的命名策略无法正确处理你的字段,也会导致映射失败。确认逆向生成的实体类是否遗漏字段
有时候逆向生成工具可能因为字段名带空格等特殊情况,没有生成对应的实体类属性,这时候需要手动在实体类中添加该属性,并配置好@Column注解映射到数据库字段。
内容的提问来源于stack exchange,提问作者TheAlmac2

