Java <;表单:选择“未正确绑定”

Java <;表单:选择“未正确绑定”,java,spring,hibernate,spring-mvc,Java,Spring,Hibernate,Spring Mvc,我有一个应用程序(Spring4MVC+Hibernate4+MySQL+Maven集成示例使用注释),使用基于注释的配置将Spring与Hibernate集成 我有这个实体: @Entity @DiscriminatorValue(value = "Application") @NamedQueries(value = {}) public class ApplicationAlarm extends Alarm implements Serializable { /* */

我有一个应用程序(Spring4MVC+Hibernate4+MySQL+Maven集成示例使用注释),使用基于注释的配置将Spring与Hibernate集成

我有这个实体:

@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中,您可以尝试将
application
更改为
application.id
,并更改select输入,使其返回您选择的应用程序的id

 <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";
     }