【问题标题】:Inner object id save in Spring 3在 Spring 3 中保存内部对象 ID
【发布时间】:2023-03-27 07:32:01
【问题描述】:

我想通过休眠来保存 Village 对象,其中需要保存已经持久化的 District id。我在下拉列表中填充了区对象。我在 spring 2 编写了类似的工作,但在 spring 3 它不起作用。

在这里,如果我在 POST 中记录 village.getDistrict(),id 设置完美,因为我设置为下拉列表,但 District 对象的其他值为 null。

@SessionAttributes({"village"})
@Controller
public class VillageController{

    @Autowired(required=true)
    private AddressService addressService;



   @RequestMapping(value="/cp/village.html", method = RequestMethod.GET)
    public String setForm(ModelMap model) {

    Village village = new Village();    
    village.setDistrict(new District());

    model.addAttribute("village", village);
    return "/cp/village";
    }
    @ModelAttribute("districtList")
    public List<District> populateDistrictList() {
    return addressService.getDistrictList();
    }



 @RequestMapping(value="/cp/village.html", method = RequestMethod.POST)
    public String getForm(@ModelAttribute("village") Village village,               
                BindingResult result, 
                SessionStatus status) {

    log.debug("============================="+village.getDistrict());

    addressService.saveVillage(village);
    status.setComplete(); 

    return "redirect:/cp/village.html123";
    }
}

在 JSP 中:

<form:form commandName ="village" action="village.html" >
      <div>
    <label><fmt:message key="location.district"/></label>
    <form:select path="district.id">
      <form:options items="${districtList}" itemValue="id" itemLabel="districtName"/>
    </form:select>
      </div>

      <div>
    <label><fmt:message key="location.village"/></label>
    <form:input path = "villageName" />    
      </div>


      <div>
    <label><fmt:message key="prompt.remarks"/></label>
    <form:textarea path = "remarks" rows="2" cols="50"/>
      </div>


    <div class = "button-area">
      <input type = "submit" value="Save" class="submit-button" />
      <input type = "button" value="Cancel" onclick="window.location='commonComplaintList.html'" class="submit-button" /> 
    </div>

    <br/>
  </form:form>

【问题讨论】:

    标签: java spring jsp spring-3


    【解决方案1】:

    您没有在 District 对象中设置任何值,因此它是空的。

    如果您期望该区域具有来自List&lt;District&gt; populateDistrictList() 的对象的值,那么我不得不说:它不是开箱即用的。

    一种方法是实现Converter,通过从数据库加载字符串(id)将其转换为 District 对象。

    【讨论】:

    • tedyoung.me/2011/02/02/… 我实现了像上面一样的转换器......但没有工作
    • in applicationContext:
    • 包 com.redmind.mpms.utils;公共类 VillageEntityObjectConverter 实现 Converter { @Autowired(required=true) private SessionFactory sessionFactory;私有类 类型;公共 VillageEntityObjectConverter() { this.type = Village.class; } @Override public Village convert( String stringKey ){ Long key = Long.parseLong( stringKey ); return (Village)sessionFactory.getCurrentSession().get(Village.class, key); } }
    【解决方案2】:

    我认为您还需要为 District 实体实施转换器。因为您的 Village 实体类的 Converter 可能在 POST 期间根本不会被调用(至少对于新的 Villages 没有,因为它们缺少 id)。此外,即使它被称为 District 仍然需要一个转换器才能从 Hibernate 获取正确的 District。否则,Spring 只会为您提供一个新的 District 实例,其中 Id 设置为 select 中的值。

    但是,如果您只想拯救 Village,我不确定您是否真的需要从 Hibernate 中获取整个 District 对象。我认为(不是 100% 确定这一点,因为我使用 Hibernate 和 Spring 已经有一段时间了)即使您只有一个带有 ID 的 District 对象,Hibernate 也会将您在 POST 中创建的村庄与正确的地区相关联。 您可能需要指定一些关于级联的注释内容,以免覆盖 District 对象的其他属性。
    编辑: 查了一下,我认为您应该使用以下内容注释 Village 类的区域属性:

    @Column(name = "district", insertable = false)
    

    这样,Hibernate 将知道在存储新村庄时不应添加新区域。
    再次不确定最后一部分,但值得快速尝试:)

    【讨论】:

      猜你喜欢
      • 2021-05-31
      • 2015-03-24
      • 2011-06-02
      • 1970-01-01
      • 2019-03-08
      • 2013-12-25
      • 2011-02-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多