Hibernate命令外键表

时间:2015-12-07 16:12:22

标签: java angularjs spring hibernate

我有一个REST API(带有Hibernate的Spring REST ),它是我所有数据的访问点。客户端应用程序( Cordova和AngularJS )连接到此API以获取数据Feed。

REST API中的我的版本是:

春天:4.2.3.RELEASE

Hibernate:4.3.11.Final

问题

在客户端应用程序中,我需要一个有序列表。当我从REST API请求列表时,几乎每次都对列表​​进行不同的排序。这非常令人讨厌,因为列表中的某些文字会显示在屏幕上,现在看起来似乎正在四处跳跃。

休眠

在我的项目中,我有以下Hibernate设置:

公司

@OneToMany(fetch = FetchType.LAZY, mappedBy = "companyId", cascade = {CascadeType.ALL})
@JsonBackReference
private Set<Employee> employees= new HashSet<Employee>();

员工

@NotNull
@Column(name = "companyId", nullable = false)
private int companyId;

公司可以拥有许多员工,但员工一次只能在一家公司工作。

Hibernate存储库

由于问题我是否使用查询,这里是我的存储库(使用Criteria /让hibernate完成工作):

public Employee findById(int id) {
   Criteria criteria = getSession().createCriteria(Employee.class);
   criteria.add(Restrictions.eq("id", id));
   return (Employee) criteria.uniqueResult();
}

弹簧

为了更好的数据处理,我正在使用序列化模型。我按如下方式实现了这个(在我的 RestController 中):

Company company = companyManager.findCompanyWithEmployees(companyName);

Set<Employee> types = company.getEmployees();
Set<EmployeeList> list = new HashSet<EmployeeList>();

for (IncidentType item : types) {
    EmployeeList newItem = new EmployeeList();
    newItem.setId(item.getId())
           .setParent(item.getParent())
           .setChildren(item.getChildren())
           .setTitle(item.getTitle())
           .setImage(item.getImage());

     list.add(newItem);
}

此代码创建一个EmployeeList项列表,我将在AngularJS代码中返回并处理。

我试过

  • 我尝试在Employee存储库(findById)中添加Criteria,但似乎Hibernate在通过外键获取表时不使用存储库。

  • 尝试添加注释,但Hibernate没有对order by的注释支持。

额外信息

由于我使用LAZY加载(出于性能原因),我在我的存储库中使用以下代码:

public Company findCompanyWithInterface(String companyName) {
   Company company = this.findByName(companyName);

   if (company == null) {
       return null;
   }
   //activate hibernate to load the employees (is LAZY loaded)
   Hibernate.initialize(company.getEmployees());

   return company;
}

我的问题

有没有办法告诉Hibernate订购通过公司实体获得的员工名单? 我知道我可以在我的代码中订购它,但这对性能来说非常糟糕。所以如果Hibernate可以订购商品会很好。

按ID排序应该没问题。如果我想要别的东西,我总能改变它。

任何人都知道如何在不影响性能的情况下实现这一目标?

解决方案

Hibernate没有order by的特定注释。 javax.persistence 确实有一个排序注释(@OrderBy())。 Hibernate检查此批注并对结果进行排序。

您需要为此使用ArrayList,以便保留顺序(如下所示)。

致Benjamin Bau的答案

1 个答案:

答案 0 :(得分:2)

将@OrderBy注释添加到您的员工。将字段从集合更改为列表,以便保留顺序。

@OneToMany(fetch = FetchType.LAZY, mappedBy = "companyId", cascade = {CascadeType.ALL})
@OrderBy("id")
@JsonBackReference
private List<Employee> employees = new ArrayList<Employee>();