我需要定义一个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;
}
答案 0 :(得分:0)
实际上,具体取决于具体用例是什么。让我们想一想几种可能性:
一次创建 Place 以及一些路由 - 在这种情况下,我会实现视图,以便创建一个复杂的结构反映实体一对一,就像你为JPA定义它们一样,并传递单个POST请求。我们基本上假设总是与地点一起创建的路线数量有限。 路由不能在不同的地方之间共享,因为它没有任何意义。
@RequestMapping(method = POST, value = "/places")
public CreatePlaceResponse createPlace(@RequestBody Place place) {
...
}
在后续请求中创建地点并提供路由。 - 如果我们需要更多灵活性和/或预期分配给的路由数量每个地方都很大,我们可能首先创建一个 Place ,然后使用另一个请求将路由分配给它(通过引用地点ID)。这样您就可以让用户逐步创建整个结构,并且可以在以后添加 Route 。
@RequestMapping(method = POST, value = "/places")
public CreatePlaceResponse createPlace(@RequestBody Place place) {
...
}
@RequestMapping(method = POST, value = "/places/{placeId}")
public AddRouteResponse addRoute(@RequestBody Route route) {
...
}
根据具体情况,您还可以考虑批量创建路由,因此将路由列表传递给已创建的地点。
答案 1 :(得分:0)
在UI方面,我可以看到这个工作使用隐藏字段来存储地点ID以响应输入的文本或者幻想&#39;选择下面的其中一个,你可以输入选择进行过滤,并且不会一次在内存中加载1000个记录:
http://silviomoreto.github.io/bootstrap-select/
无论哪种方式,您都要将隐藏字段或所选选项绑定到:
route.place
e.g。
<form:hidden path="place" value="id_of_place_updated_by_javascript" />
或
<form:select path="place">
然后您将注册一个转换器,它将提交的值转换为所需的类型,即Place。在提交时,转换器将获取Place ID并从数据库中检索相应的Place。然后框架将转换器返回的Place绑定到支持表单的Route。
有关使用Formatter进行转换的示例,请参阅此处:
http://springinpractice.com/2012/01/07/making-formselect-work-nicely-using-spring-3-formatters
在最后的示例中,您只需前往数据库即可获取相关实体,而不是创建新实例。