[英]How to define forms to persist complex objects in Spring?
我需要定义一个from来创建我的一个对象的实例。 这是一项容易的任务,我已经有一些任务,但是此特定对象引用了必须在表单中定义的其他对象。 如何才能做到这一点? 我知道我可以要求用户输入de id并将其存储在DTO中,然后再获取真实对象,但是我想这不是实现此目的的最佳方法。 我能做什么?
我把我的实体放在这里:
@Entity
public class Route {
@Id
@GeneratedValue
private Long id;
@Column(nullable = false)
private Long distance;
@Column(nullable = false)
private String name;
private String description;
@ManyToOne
@JoinColumn
private Place origin;
}
这是引用对象:
@Entity
public class Place {
@Id
@GeneratedValue
private Long id;
@Column(nullable = false)
private String name;
private Long latitude;
private Long longitude;
private String imagePath;
@OneToMany(mappedBy = "origin", cascade = CascadeType.REMOVE)
private Set<Route> originRoutes;
}
实际上,具体取决于用例是什么。 让我们考虑几种可能性:
一口气立即创建一个Place和一些Routes-在这种情况下,我将实现视图,以便它创建一个复杂的结构,像您为JPA定义实体一样一对一地反映实体,并传递单个POST请求。 我们基本上假设总是与地点一起创建的路线数量有限。 路线无法在不同的地方之间共享,因为这毫无意义。
@RequestMapping(method = POST, value = "/places")
public CreatePlaceResponse createPlace(@RequestBody Place place) {
...
}
创建一个地方并在后续请求中提供路线 。 -如果我们想要更大的灵活性和/或期望分配给每个地点的路线数量很大,我们可以首先创建一个地点 ,然后使用另一个请求为其分配路线 (通过参考地点ID)。 这样,你让用户创建一个脚印整体结构的台阶,再加上你给的可能性增加一条路由以后。
@RequestMapping(method = POST, value = "/places")
public CreatePlaceResponse createPlace(@RequestBody Place place) {
...
}
@RequestMapping(method = POST, value = "/places/{placeId}")
public AddRouteResponse addRoute(@RequestBody Route route) {
...
}
根据情况,您还可以考虑批量创建路线 ,因此将路线列表传递到已创建的位置。
在UI端,我可以看到使用隐藏字段存储位置ID来响应输入的文本,或者使用“花式”选择(例如下面的其中一种选择)进行操作,您可以在其中输入选择内容进行过滤并赢得一次不会在内存中加载1000条记录:
http://silviomoreto.github.io/bootstrap-select/
无论哪种方式,您都将将隐藏字段或所选选项绑定到:
route.place
例如
<form:hidden path="place" value="id_of_place_updated_by_javascript" />
要么
<form:select path="place">
然后,您将注册一个转换器,该转换器会将提交的值转换为所需的类型,即Place。 提交后,您的转换器将获取Place ID,并从数据库中检索相应的Place。 然后,框架会将转换器返回的Place绑定到支持表单的Route上。
有关使用格式化程序进行转换的示例,请参见此处:
http://springinpractice.com/2012/01/07/making-formselect-work-nicely-using-spring-3-formatters
在最后一个示例中,您将直接进入数据库以获取相关实体,而不是创建新实例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.