我正在尝试实现简单的Spring数据应用程序。我有几个字段的简单实体雇员,我使用CrudRepository: findById的方法从数据库中检索Employee。但结果总是为空,实体中的onlny 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实体使用setter/getter扩展只有一个字段"id“的BaseEntity。
雇员资料库:
@Repository
public interface EmployeeRepository extends CrudRepository<Employee, Integer> {
}
EmployeeService:
@Service
public class EmpService {
@Autowired
private EmployeeRepository employeeRepository;
public Employee getEmployee(int id) {
return employeeRepository.findById(id).get();
}
}
之后,我尝试在主控制器中使用system.out.println,并在简单索引页上显示数据。我确信显示数据不是问题,因为Hibernate一切都很好。所有带有Spring数据的记录都只有ID字段。还有来自控制台登录的查询:
Hibernate:选择employee0_.id_employee为id_emplo1_2__,employee0_.emp_password为emp_pass2_2__,employee0_.emp_role为emp_role3_2__,employee0_.emp_enabled为emp_enab4_2__,employee0_.emp_first_name为emp_firs5_2__,employee0_.emp_last_name为emp_last6_2__,employee0_.emp_birth_date为emp_birt7_2__,employee0_.emp_avatar为emp_avat8_2__,employee0_.emp_department_id为emp_depa9_2__,employee0_.emp_position_id为emp_pos10_2__,employee0_.emp_manager_id为emp_man11_2__,employee0_.emp_is_manager为emp_is_12_2__,employee0_.emp_evidence_number为emp_evi13_2__,employee0_.emp_area_of_work为emp_are14_2__,employee0_.emp_working_hours_per_day为emp_wor15_2__,employee0_.emp_first_work_day as emp_fir16_2__从vacation_tool.vt_employee employee0_ employee0_.id_employee=?
如何从数据库中获取所有字段?我的桌子上有15张有完整数据的记录。
发布于 2018-08-17 11:56:08
如果没有代码,就很难提供帮助,但是您可以检查:
发布于 2018-08-17 16:46:11
我发现了问题。在使用我的代码时,没有任何错误/警告,但我在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中更改列名但未更改属性时,它仍然在属性文件中使用错误的列名(当然,在这种情况下hibernate不能工作,所以我也用“_”更改了属性)。我不知道该怎么做?
2)为什么需要在列名中的每一个单词例如"first_name“之后使用"_”,而不是"firstName"?
https://stackoverflow.com/questions/51901366
复制