Spring jsp提交表单与onetomany关系

时间:2014-10-15 06:30:25

标签: jsp spring-mvc

我有两个实体: StoryType 故事。 StoryType可能有很多故事。

@Entity
@Table(name = "stories")
public class Story {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Integer id;

    @Column(name = "name")
    private String name;

    @Column(name = "description")
    private String description;

    @Column(name = "crdate")
    @Temporal(TemporalType.TIMESTAMP)
    private Date crDate;

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name = "story_type_id")
    private StoryType storyType;
}

@Entity
@Table(name="story_types")
public class StoryType {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Integer id;

    @Column(name = "name")
    private String name;

    @OneToMany(fetch = FetchType.EAGER, mappedBy="storyType", cascade = CascadeType.ALL)
    private List<Story> stories;
}

我在jsp页面上有表格,我在这里添加故事,我应该选择故事的类型。但是当我看到提交的值时,只有名称和描述,storyType - null。如何从select中发送对象,甚至只输入id?

<form role="form" action="/admin/add-story" method="post" commandName="story">
    <div class="form-group">
        <label for="name">Name</label>
        <input type="text" name="name" class="form-control" id="name" autofocus="true" placeholder="Enter name" value="${story.name}">
    </div>
    <div class="form-group">
        <label for="name">Type</label>
        <select class="form-control">
            <c:forEach items="${types}" var="type">
                <option name="storyType" value="${type}">${type.name}</option>
            </c:forEach>
        </select>
    </div>
    <div class="form-group">
        <label for="description">Desscription</label>
        <input type="text" name="description" class="form-control" id="description" autofocus="true" value="${story.description}">
    </div>
    <input type="submit" class="btn btn-primary" value="Save"/>
</form>

1 个答案:

答案 0 :(得分:2)

在客户端中,您只能存储id的{​​{1}}

StoryType

将数据发布到服务器时,客户端会将<select class="form-control"> <c:forEach items="${types}" var="type"> <option name="storyType" value="${type.id}">${type.name}</option> </c:forEach> </select> 发布到服务器。我们创建一个Spring Converter来从数据库中获取type.id对象。

StoryType

注册convertionService

public class StoryTypeConverter implements Converter<String, StoryType >{

@Autowired
private StoryTypeService storyTypeService;

public StoryType convert(String id) {
    return storyTypeService.findById(Long.valueOf(id));
   }
}

之后,控制器中的对象将包含StoryType。 我是否有另一种方法来解决这个问题。 认为它可以帮助