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,结构如下:
- 域
- 回购
- repoImpl
- 服务
- serviceImpl
我需要做的是在 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,它对序列化没有任何影响,只是告诉持久化提供者在持久化
时忽略该字段
我有以下简单场景:
Cars table: Id, Name, Model
Cars Schedule table:Id, CarId, ScheduleTime, ScheduleDate
我正在使用 Spring MVC 和 Hibernate,结构如下:
- 域
- 回购
- repoImpl
- 服务
- serviceImpl
我需要做的是在 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,它对序列化没有任何影响,只是告诉持久化提供者在持久化
时忽略该字段