如何定义表单以在Spring中持久化复杂对象?

时间:2014-12-23 14:21:02

标签: java spring forms spring-mvc persist

我需要定义一个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;

}

2 个答案:

答案 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。

http://docs.spring.io/spring/docs/current/spring-framework-reference/html/validation.html#core-convert

有关使用Formatter进行转换的示例,请参阅此处:

http://springinpractice.com/2012/01/07/making-formselect-work-nicely-using-spring-3-formatters

在最后的示例中,您只需前往数据库即可获取相关实体,而不是创建新实例。