【问题标题】:Spring Data returns empty entitySpring Data 返回空实体
【发布时间】:2018-08-17 18:54:24
【问题描述】:

我正在尝试实现简单的 Spring Data 应用程序。我有几个字段的简单实体 Employee,我使用 CrudRepository 中的方法:findById 从数据库中检索员工。 但总是结果为空,实体中的唯一 ID 字段是正确的,但其他字段为空。即使我试图获取 findAll() ,那么我已经从表中获取了所有记录,但它们只有 ID 字段,没有别的。

我不使用 Hibernate .hbm.xml 的 XML 文件。用 hbm.xml 看起来实体如何:

员工实体:

public class Employee extends BaseEntity {
private static final long serialVersionUID = -1400760321767476971L;
private String empFirstName;
private String empPassword;
private String empRole;
private String empLastName;
private String empBirthDate;
private String empAvatar;
private Integer empDepartmentId;
private Integer empEnabled;
private Integer empPositionId;
private Integer empManagerId;
private Integer empIsManager;
private String empEvidenceNumber;
private Double empAreaOfWork;
private Integer empWorkingHoursPerDay;
private String empFirstWorkDay;

...getters/setters/constructors

Employee.hbm.xml:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="entity.Employee" table="vt_employee" catalog="VacationTool"
    optimistic-lock="version">


    <id name="id" type="java.lang.Integer">
        <column name="id_employee" />
        <generator class="identity" />
    </id>
    <property name="empPassword" type="string">
        <column name="emp_password" length="60" />
    </property>
    <property name="empRole" type="string">
        <column name="emp_role" length="45" />
    </property>
    <property name="empEnabled" type="java.lang.Integer">
        <column name="emp_enabled" />
    </property>
    <property name="empFirstName" type="string">
        <column name="emp_firstName" length="75" />
    </property>
    <property name="empLastName" type="string">
        <column name="emp_lastName" length="75" />
    </property>
    <property name="empBirthDate" type="string">
        <column name="emp_birthDate" length="10" />
    </property>
    <property name="empAvatar" type="string">
        <column name="emp_avatar" />
    </property>
    <property name="empDepartmentId" type="java.lang.Integer">
        <column name="emp_department_id" />
    </property>
    <property name="empPositionId" type="java.lang.Integer">
        <column name="emp_position_id" />
    </property>
    <property name="empManagerId" type="java.lang.Integer">
        <column name="emp_manager_id" />
    </property>
    <property name="empIsManager" type="java.lang.Integer">
        <column name="emp_isManager" />
    </property>
    <property name="empEvidenceNumber" type="string">
        <column name="emp_evidenceNumber" length="4" />
    </property>
    <property name="empAreaOfWork" type="java.lang.Double">
        <column name="emp_areaOfWork" precision="3" />
    </property>
    <property name="empWorkingHoursPerDay" type="java.lang.Integer">
        <column name="emp_workingHoursPerDay" />
    </property>
    <property name="empFirstWorkDay" type="string">
        <column name="emp_firstWorkDay" length="10" />
    </property>


</class>
</hibernate-mapping>

Employee 实体扩展了 BaseEntity,只有一个字段“id”和 setter/getter。

员工资料库:

@Repository
public interface EmployeeRepository extends CrudRepository<Employee, Integer> {

}

员工服务:

@Service
public class EmpService {
   @Autowired
   private EmployeeRepository employeeRepository;

   public Employee getEmployee(int id) {
       return employeeRepository.findById(id).get();

   }
}

之后我尝试在主控制器中使用 system.out.println 并在简单的索引页面上显示数据。 我确信显示数据不是问题,因为 Hibernate 一切正常。所有带有 Spring Data 的记录都只有 ID 字段。 并且有登录控制台的查询:

休眠:选择employee0_.id_employee如id_emplo1_2_0_,employee0_.emp_password如emp_pass2_2_0_,employee0_.emp_role如emp_role3_2_0_,employee0_.emp_enabled如emp_enab4_2_0_,employee0_.emp_first_name如emp_firs5_2_0_,employee0_.emp_last_name如emp_last6_2_0_,employee0_.emp_birth_date如emp_birt7_2_0_,employee0_。 emp_avatar如emp_avat8_2_0_,employee0_.emp_department_id如emp_depa9_2_0_,employee0_.emp_position_id如emp_pos10_2_0_,employee0_.emp_manager_id如emp_man11_2_0_,employee0_.emp_is_manager如emp_is_12_2_0_,employee0_.emp_evidence_number如emp_evi13_2_0_,employee0_.emp_area_of_work如emp_are14_2_0_,employee0_.emp_working_hours_per_day如emp_wor15_2_0_,employee0_.emp_first_work_day如emp_fir16_2_0_ from holiday_tool.vt_employee employee0_ where employee0_.id_employee=?

如何从数据库中获取所有字段?我的表中有 15 条记录完整的数据。

【问题讨论】:

  • 密码是什么?错误?
  • 好像数据库表的列名可能与Employee实体类中的字段名不匹配。如果您发布用于创建表和 Employee 类的代码,我们可能会提供帮助。
  • 我添加了我的代码

标签: java spring spring-data


【解决方案1】:

我发现了问题。 在使用我的代码期间,没有任何错误/警告,但我发现了一个要添加到 application.properties 中的属性:

hibernate.hbm2ddl.auto=update

这一行在表格中创建了缺失的列,所以我只是想检查一下。之后在控制台中,我看到为所有超过一个单词的列创建了新列 例如在我的表中,我有“emp_firstName”,并且正在创建新列“emp_first_name”。即使在我的 .hbm.xml 我已经声明了这个字段:

<property name="empFirstName" type="string">
    <column name="emp_firstName" length="75" />
</property>

它不起作用。 因此,当我在控制台日志中发现这一点时,我使用“_”更改了此列和其他列,然后一切正常。

但我无法理解两件事

1) 当我更改列名但未更改 .hbm.xml 中的属性时,它仍然可以在属性文件中使用错误的列名(当然休眠在这种情况下不起作用,所以我也使用“_”更改了属性) .我不知道该怎么办?

2) 为什么需要在每个单词后使用“_”,例如列名中的“first_name”而不是例如“名字”?

【讨论】:

    【解决方案2】:

    没有代码帮助有点困难,但你可以检查一下:

    • 是否可以访问其他字段(setter 或 public 修饰符)?
    • 字段是否映射到右列? @Column(name="my_column")

    【讨论】:

    • 所有字段都有设置器/获取器 - 我认为这不是问题,因为完全相同的实体可以在休眠状态下正常工作,并且我正在使用 XML 映射 .hbm.xml
    猜你喜欢
    • 2020-03-26
    • 2016-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-16
    • 1970-01-01
    • 2017-10-15
    • 1970-01-01
    相关资源
    最近更新 更多