【问题标题】:How did spring MVC send data to Model Obj with hibernatespring MVC如何通过hibernate向Model Obj发送数据
【发布时间】:2011-07-09 09:07:47
【问题描述】:

我有

class Person  {

@OneToMany(cascade = CascadeType.ALL)
 @JoinTable(name = "person_countries", joinColumns = { @JoinColumn(name = "person_id") }, 
         inverseJoinColumns = { @JoinColumn(name = "country_id") })
 private List<Country> countries ; 

Class country {

@Id
@Column(name = "country_id")
@GeneratedValue
private  Integer country_id;


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

现在我在表单中显示复选框,以便用户可以选择多个国家。但我很困惑该表格如何将国家对象发送给个人。

addpage.jsp

<form:form modelAttribute="personAttribute" method="POST" action="${saveUrl}">

<form:checkboxes path="countries" items="${countryList}" itemValue="country_id" itemLabel="country_name" />

这是生成的html

<label for="countries2">uk</label></span><span><input id="countries3" name="countries" type="checkbox" value="3"/>

但我很困惑该数据将如何亲自存储国家 obj 我的意思是休眠需要将哪个值存储在关系表中它的值或标签,因为国家名称已经在数据库中。我只需要存储它的 id。

我很困惑映射将如何发生。因为我没有输入国名。它们已经存在于数据库中

【问题讨论】:

    标签: java hibernate spring-mvc


    【解决方案1】:

    当 spring 将表单与对象绑定时,它会实例化该对象(您也可以插入自己的创建过程)。

    所以对象填充了所有需要的数据,但它处于分离状态(它不属于休眠会话)

    当您将对象合并到休眠状态时,它会尝试加载与您分离的对象中指定的 ID 相同的现有实体。如果有这样的 - 它们被加载和使用。

    这就是一般情况下的工作方式。在您的情况下,HTML 应仅提交国家 ID,然后应从数据库(通过休眠)加载该国家,并将其设置到用户对象中。

    您可以在 @InitBinder 方法中执行此操作,方法是注册一个自定义属性编辑器 - 一个给定国家 ID 的编辑器加载整个国家对象..

    【讨论】:

      【解决方案2】:

      在关系 tbl 中,它会根据规则规范化存储 chkbox 的值,即 country_id。您无需输入国家名称,因为这些将通过您的 @Jointable 注释获取。

      【讨论】:

      • 我不知道问题出在哪里,person_countries 表总是空着。那里没有输入任何值。我需要在该映射中提及表格国家/地区
      • Pasha,请检查该值是否进入您的控制器。如果没有,请告诉我。
      猜你喜欢
      • 2013-09-06
      • 1970-01-01
      • 2017-05-10
      • 1970-01-01
      • 1970-01-01
      • 2013-06-21
      • 1970-01-01
      • 2019-10-25
      • 2013-05-03
      相关资源
      最近更新 更多