Spring 带 Hibernate 的 MVC - 一对多

Spring MVC with Hibernate - One to Many

我有以下简单场景:

Cars table: Id, Name, Model

Cars Schedule table:Id, CarId, ScheduleTime, ScheduleDate

我正在使用 Spring MVC 和 Hibernate,结构如下:

我需要做的是在 CarsSchedule 列表中显示汽车名称,而不必在 CarsSchedule table.

中添加一个名为 CarName 的字段

执行此操作的最佳做​​法是什么?

我认为你应该在 table Cars Schedule 中建立一对多关系:

//in class CarsSchedule
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "CAR_ID", nullable = false)
public Stock getCar() {
    return this.car;
}

然后在控制器中,检索 CarSchedule 列表(其中也包含 Car)并将列表放入模型中:

@RequestMapping(value = "car-list", method = RequestMethod.GET)
     public String getList(HttpSession session, Map<String, Object> model) {
      //get the list from the service
      List<CarsSchedule> list = service.getCarScheduleList();  
      //put into the model
      model.put("form", new PersonUserRoleForm());
      return "mymodel";
}

那么你可能有一个 mymodel.jsp,你可以在其中检索变量 mymodel

您可以按照这个简单的教程进行操作: http://www.mkyong.com/hibernate/hibernate-one-to-many-relationship-example-annotation/

再见

Car 实体中你应该有

@OneToMany(mappedBy = "car")
private List<CarsSchedule> schedules;

我假设关系是 @OneToMany,但如果是这样的话,您可以将其切换为 @OneToOne private CarsSchedule schedule;

并且在 CarsSchedule 实体中,这个

@ManyToOne
@JoinColumn(name = "CarId")
private Car car;

使用此设置,一旦您在控制器(和模型)中拥有 carsSchedule 实例,您就可以在页面上显示带有 #{carsSchedule.car.name} 的汽车名称。

如果您在 属性 访问器方法上设置注释,您只需添加

@Transient
public String getName() {
    return car.getName();
}

它将对您的数据库不可见,但对所有其他图层可见。在 JSP 中,您将以 ${carsSchedule.name} 的形式访问它,并且在您的 JSON 或 XML 中,如果您使用的是

表示形式,它将是直接子级

即使您自己注释属性,您仍然可以这样做

@Transient
private String name;

public String getName() {
    return car.getName();
}

我发现你的主要想法是避免持久化另一个字段。请注意,瞬态注释是 javax.persistence.Transient,它对序列化没有任何影响,只是告诉持久化提供者在持久化

时忽略该字段