2016-03-05 117 views
0

我有一个应用程序(使用注释的Spring 4 MVC + Hibernate 4 + MySQL + Maven集成示例),使用基于注释的配置集成Spring和Hibernate。<form:select not binding correctly

我有这样的实体:

@Entity 
@DiscriminatorValue(value = "Application") 
@NamedQueries(value = {}) 
public class ApplicationAlarm extends Alarm implements Serializable { 

    /* */ 
    private static final long serialVersionUID = -507197670530074142L; 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "application_id") 
    private Application application; 



    /** 
    * Gets the application. 
    * 
    * @return the application 
    */ 
    public Application getApplication() { 
     return application; 
    } 

    /** 
    * Sets the application. 
    * 
    * @param p_application 
    *   the new application 
    */ 
    public void setApplication(final Application p_application) { 
     application = p_application; 
    } 

} 

这:

@Entity 
@Table(name = "alarm") 
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(name = "type") 
@NamedQueries(value = {}) 
public abstract class Alarm implements Serializable { 

    /* */ 
    private static final long serialVersionUID = -3210359168688290412L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 

    @Enumerated(EnumType.STRING) 
    @Column(name = "action", 
      nullable = false) 
    private AlarmAction action; 

    @Enumerated(EnumType.STRING) 
    @Column(name = "level", 
      nullable = false) 
    private AlarmLevel level; 

    @Column(name = "type", 
      nullable = false, 
      insertable = false, 
      updatable = false) 
    private String type; 

    @ManyToMany(fetch = FetchType.LAZY, 
       mappedBy = "alarms") 
    private List<Guardian> guardians = new ArrayList<Guardian>(); 

    @ManyToMany(fetch = FetchType.LAZY, 
       mappedBy = "alarms") 
    private List<TimeLapse> timeLapses = new ArrayList<TimeLapse>(); 

    @Version 
    @Column(name = "version") 
    private Long version = new Long(0); 

    /** 
    * Gets the id. 
    * 
    * @return the id 
    */ 
    public Long getId() { 
     return id; 
    } 

    /** 
    * Sets the id. 
    * 
    * @param p_id 
    *   the new id 
    */ 
    public void setId(final Long p_id) { 
     id = p_id; 
    } 

    /** 
    * Gets the action. 
    * 
    * @return the action 
    */ 
    public AlarmAction getAction() { 
     return action; 
    } 

    /** 
    * Sets the action. 
    * 
    * @param p_action 
    *   the new action 
    */ 
    public void setAction(final AlarmAction p_action) { 
     action = p_action; 
    } 

    /** 
    * Gets the level. 
    * 
    * @return the level 
    */ 
    public AlarmLevel getLevel() { 
     return level; 
    } 

    /** 
    * Sets the level. 
    * 
    * @param p_level 
    *   the new level 
    */ 
    public void setLevel(final AlarmLevel p_level) { 
     level = p_level; 
    } 



    /** 
    * Gets the type. 
    * 
    * @return the type 
    */ 
    public String getType() { 
     return type; 
    } 

    /** 
    * Sets the type. 
    * 
    * @param p_type 
    *   the new type 
    */ 
    public void setType(final String p_type) { 
     type = p_type; 
    } 

    /** 
    * Gets the guardians. 
    * 
    * @return the guardians 
    */ 
    public List<Guardian> getGuardians() { 
     return guardians; 
    } 

    /** 
    * Sets the guardians. 
    * 
    * @param p_guardians 
    *   the new guardians 
    */ 
    public void setGuardians(final List<Guardian> p_guardians) { 
     guardians = p_guardians; 
    } 



    public List<TimeLapse> getTimeLapses() { 
     return timeLapses; 
    } 

    public void setTimeLapses(List<TimeLapse> timeLapses) { 
     this.timeLapses = timeLapses; 
    } 

    /** 
    * Gets the version. 
    * 
    * @return the version 
    */ 
    public Long getVersion() { 
     return version; 
    } 

    /** 
    * Sets the version. 
    * 
    * @param p_version 
    *   the new version 
    */ 
    public void setVersion(final Long p_version) { 
     version = p_version; 
    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see java.lang.Object#equals(java.lang.Object) 
    */ 
    @Override 
    public boolean equals(final Object p_obj) { 
     boolean isEquals = false; 

     try { 
      final ApplicationAlarm application = (ApplicationAlarm) p_obj; 
      final EqualsBuilder eb = new EqualsBuilder(); 

      eb.append(getAction(), application.getAction()); 
      eb.append(getLevel(), application.getLevel()); 
      eb.append(getType(), application.getType()); 

      isEquals = eb.isEquals(); 
     } catch (final Exception e) { 
      isEquals = false; 
     } 

     return isEquals; 
    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see java.lang.Object#hashCode() 
    */ 
    @Override 
    public int hashCode() { 
     final HashCodeBuilder hcb = new HashCodeBuilder(); 
     hcb.append(getAction()); 
     hcb.append(getLevel()); 
     hcb.append(getType()); 

     return hcb.toHashCode(); 
    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see java.lang.Object#toString() 
    */ 
    @Override 
    public String toString() { 
     ToStringBuilder tsb = new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE); 

     tsb.append("id", getId()); 
     tsb.append("action", getAction()); 
     tsb.append("level", getLevel()); 
     //tsb.append("guardians", getGuardians()); 
     tsb.append("type", getType()); 
     //tsb.append("guardians", getGuardians()); 
     tsb.append("version", getVersion()); 

     return tsb.toString(); 
    } 

} 

在JSP:

<form:form id="alarmRegisterForm" 
          cssClass="form-horizontal" 
          modelAttribute="alarm" 
          method="post" 
          action="${pageContext.request.contextPath}/alarm/save" > 

        <form:hidden path="id" value="${alarm.id}"/> 

        <div class="form-group"> 
         <div class="control-label col-xs-3"><form:label path="action" >Application</form:label> </div> 
         <div class="col-xs-6"> 
          <form:select path="application" items="${applications}" itemValue="id" itemLabel="description" /> 
         </div> 
        </div>  

        <div class="form-group"> 
         <div class="control-label col-xs-3"><form:label path="action" >Action</form:label> </div> 
         <div class="col-xs-6"> 
          <form:select path="action"> 
           <form:options items="${alarmActions}" /> 
          </form:select> 
         </div> 
        </div>  

        <div class="form-group"> 
         <div class="control-label col-xs-3"><form:label path="level" >Level</form:label> </div> 
         <div class="col-xs-6"> 
          <form:select path="level"> 
           <form:options items="${alarmLevels}" /> 
          </form:select> 
         </div> 
        </div> 

        <div class="form-group"> 
         <div class="control-label col-xs-3"><form:label path="level" >Time Lapse</form:label> </div> 
         <div class="col-xs-6"> 
          <form:select path="timeLapses" items="${timeLapses}" itemValue="id" itemLabel="name" /> 
         </div> 
        </div> 

        <div class="form-group"> 
         <div class="control-label col-xs-3"><form:label path="level" >Guardians</form:label> </div> 
         <div class="col-xs-6"> 
          <form:select path="guardians" items="${guardians}" itemValue="id" itemLabel="name" /> 
         </div> 
        </div>   

        <div class="form-group"> 
         <div class="row"> 
          <div class="col-xs-4"> 
           <input type="button" id="Cancel" class="btn btn-primary" value="Cancel" /> 
          </div> 
          <div class="col-xs-4"> 
           <input type="submit" id="saveAlarm" class="btn btn-primary" value="Save" /> 
          </div> 
          <div class="col-xs-4"> 
          </div> 
         </div> 
        </div> 

       </form:form> 

控制器:

@RequestMapping(value = { "/save" }, method = RequestMethod.POST) 
    public String saveAlarm(/* @Valid */ final ApplicationAlarm alarm, final BindingResult result, final ModelMap model) { 

     LOGGER.info("Saving the Alarm : " + alarm); 

     if(alarm.getId() == null){ 
      getAlarmMutatorService().save (alarm); 
     } else { 
      getAlarmMutatorService().update(alarm); 
     } 

     return "alarm.list"; 
    } 

但不映射属性应用因为是空

回答

0

选择只能指向一个值,因为application是一个对象,选择不能映射到相应的对象。

取而代之,在jsp中,您可以尝试更改applicationapplication.id并更改选择输入,以便它将返回您选择的应用程序的ID。