3

私はこの編集フォームを持っています:

ここに画像の説明を入力

ユーザーの役割が選択されるようにしたい。これが 1 対多の関係である場合、次のようなことができることがわかります。

        <form:label path="roles">Roles:</form:label>
        <form:select multiple="true" path="roles">
            <c:forEach items="${roles}" var="rol">
                <c:choose>
                    <c:when
                        test="${usuarioEdit.rol.id ==rol.id}">
                        <option value="${rol.id}" selected="selected">${rol.nombre}</option>
                    </c:when>
                    <c:otherwise>
                        <option value="${rol.id}">${rol.nombre}</option>
                    </c:otherwise>
                </c:choose>

            </c:forEach>
        </form:select>
        <form:errors cssStyle="color:red" path="roles"></form:errors>

しかし、これは多対多の関係です。編集フォームでオプションを選択するにはどうすればよいですか? 簡単なフォームはありますか?

このコードは機能しますが、Spring が機能を提供するかどうかは疑問です。

<form:select multiple="true" path="roles">
            <c:forEach items="${roles}" var="rol">
                <c:set var="isSelected" value="false" />
                <c:forEach items="${rolesUsu}" var="rolUsu">
                    <c:if test="${rolUsu.getRol().getId()==rol.id}">
                        <c:set var="isSelected" value="true" />
                    </c:if>
                </c:forEach>
                <c:choose>
                    <c:when test="${isSelected}">
                        <option value="${rol.id}" selected="selected">${rol.nombre}</option>
                    </c:when>
                    <c:otherwise>
                        <option value="${rol.id}">${rol.nombre}</option>
                    </c:otherwise>
                </c:choose>
            </c:forEach>
        </form:select>

編集:

私のコントローラーには次のものがあります:

@InitBinder
    public void initBinder(WebDataBinder binder) {

        binder.registerCustomEditor(Set.class, "roles",
                new RolCollectionEditor(Set.class, rolDao));

    }

RolCollectionEditor:

public class RolCollectionEditor extends CustomCollectionEditor {

     private final RolDAO rolDao;


    public RolCollectionEditor(Class<?> collectionType, RolDAO rolDao) {

        super(collectionType);
        this.rolDao = rolDao;

    }

    @Override
    protected Object convertElement(Object element) {
        String rolId = (String) element;

        Rol rol = rolDao.findById(rolId);
        Usuario_Rol usuRol = new Usuario_Rol();

        //Agregamos un usuario vacio temporal
        //y lo sobreescribimos en el controlador
        Usuario usuario = new Usuario();

        usuRol.setUsuario(usuario);
        usuRol.setRol(rol);
        usuRol.setFechaCreacion(new Date());
        usuRol.setFechaModificacion(new Date());
        usuRol.setStatus("activo");

        return usuRol;
    }

}

ここで、Usuario_Rol は多対多の関係の中間テーブルであり、userId と rolId 以外の他の属性があります。

編集2:

ロールクラス:

@Entity
@Table(name = "rol", uniqueConstraints = { @UniqueConstraint(columnNames = "nombre") })
public class Rol implements Serializable{

    @Id
    @Column(name = "_id")
    private String id;

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

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

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

    @Column(name = "fechaCreacion")
    private Date fechaCreacion;

    @Column(name = "fechaModificacion")
    private Date fechaModificacion;

    @Column(name = "fechaSincronizacion")
    private Date fechaSincronizacion;

    @OneToMany(fetch = FetchType.EAGER, mappedBy = "usuarioRol_pk.rol", orphanRemoval = true, cascade=CascadeType.ALL)
    private Set<Usuario_Rol> usuarios = new HashSet<Usuario_Rol>(0);


    //getters and setters

    @Override
    final public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((nombre == null) ? 0 : nombre.hashCode());
        return result;
    }

    @Override
    final public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (!(obj instanceof Rol))
            return false;
        Rol other = (Rol) obj;
        if (nombre == null) {
            if (other.nombre != null)
                return false;
        } else if (!nombre.equals(other.nombre))
            return false;
        return true;
    }

クラス・ウスアリオ:

@Entity @Table(name = "usuario", uniqueConstraints = { @UniqueConstraint(columnNames = "login"), @UniqueConstraint(columnNames = "correo") }) public class Usuario は Serializable を実装します {

@Id
@Column(name = "_id")
private String id;

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

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

@Column(name = "login")
@Size(min = 4)
@NotEmpty
private String login;

@Column(name = "password")
@NotEmpty
@Size(min = 4)
private String password;

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

@Column(name = "correo")
@NotEmpty
@Email
private String correo;

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

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

@Column(name = "fechaUltimoLogin")
private Date fechaUltimoLogin;

@Column(name = "fechaCreacion")
private Date fechaCreacion;

@Column(name = "fechaModificacion")
private Date fechaModificacion;

@Column(name = "fechaSincronizacion")
private Date fechaSincronizacion;

@NotEmpty
@OneToMany(fetch = FetchType.EAGER, mappedBy = "usuarioRol_pk.usuario", orphanRemoval = true, cascade = CascadeType.ALL)
private Set<Usuario_Rol> roles = new HashSet<Usuario_Rol>(0);


//constructor, getters and setters.

@Override
final public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((login == null) ? 0 : login.hashCode());
    return result;
}

@Override
final public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (!(obj instanceof Usuario))
        return false;
    Usuario other = (Usuario) obj;
    if (login == null) {
        if (other.login != null)
            return false;
    } else if (!login.equals(other.login))
        return false;
    return true;
}

中級クラス:

@Entity
@Table(name = "usuario_rol")
@AssociationOverrides({
    @AssociationOverride(name = "usuarioRol_pk.usuario", joinColumns = @JoinColumn(name = "idUsuario")),
    @AssociationOverride(name = "usuarioRol_pk.rol", joinColumns = @JoinColumn(name = "idRol")) 
})
public class Usuario_Rol implements Serializable{

    @EmbeddedId
    private Usuario_RolId usuarioRol_pk = new Usuario_RolId();

    @Temporal(TemporalType.DATE)
    @Column(name = "fechaCreacion")
    private Date fechaCreacion;

    @Temporal(TemporalType.DATE)
    @Column(name = "fechaModificacion")
    private Date fechaModificacion;

    @Temporal(TemporalType.DATE)
    @Column(name = "fechaSincronizacion")
    private Date fechaSincronizacion;

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

    //gettters, setters

    @Override
    final public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((usuarioRol_pk == null) ? 0 : usuarioRol_pk.hashCode());
        return result;
    }


    @Override
    final public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (!(obj instanceof Usuario_Rol))
            return false;
        Usuario_Rol other = (Usuario_Rol) obj;
        if (usuarioRol_pk == null) {
            if (other.usuarioRol_pk != null)
                return false;
        } else if (!usuarioRol_pk.equals(other.usuarioRol_pk))
            return false;
        return true;
    }

Usuario_RolId:

@Embeddable
public class Usuario_RolId implements Serializable{

    @ManyToOne
    private Usuario usuario;

    @ManyToOne
    private Rol rol;

    public Usuario getUsuario() {
        return usuario;
    }
    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }
    public Rol getRol() {
        return rol;
    }
    public void setRol(Rol rol) {
        this.rol = rol;
    }


    @Override
    final public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((rol == null) ? 0 : rol.hashCode());
        result = prime * result + ((usuario == null) ? 0 : usuario.hashCode());
        return result;
    }

    @Override
    final public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (!(obj instanceof Usuario_RolId))
            return false;
        Usuario_RolId other = (Usuario_RolId) obj;
        if (rol == null) {
            if (other.rol != null)
                return false;
        } else if (!rol.equals(other.rol))
            return false;
        if (usuario == null) {
            if (other.usuario != null)
                return false;
        } else if (!usuario.equals(other.usuario))
            return false;
        return true;
    } 

この最後のクラスは、多対多の関係をシミュレートするトリックに使用されます。私はこのチュートリアルに従いました: http://www.mkyong.com/hibernate/hibernate-many-to-many-example-join-table-extra-column-annotation/

4

4 に答える 4

5

なんで自分で書いてんの?春はあなたのためにそれを行うことができるはずです。<c:forEach />そのブロック全体を<form options .. />タグに置き換える代わりに。その後、Spring は選択自体を行うことができます (そのためには、ConverterまたはPropertyEditorが必要になる場合があります)。

<form:select multiple="true" path="roles" items="${roles}" itemLabel="nombre" itemValue="id" />

これらの線に沿った何か...

リンク:

  1. フォーム オプションのドキュメント
  2. フォーム選択のドキュメント
  3. リファレンスガイド
于 2013-09-11T08:24:41.057 に答える
1

私が質問を正しく理解していれば、次のような HTML を生成するための Spring タグが必要です。

    <select id="roles" name="roles multiple="multiple">
       <option value="1">Administrador</option>
       <option value="2">Usuario avanzado</option>
       <option value="3" selected="selected">Usuario </option>
       <option value="4" selected="selected">Invitado</option>
    </select>

ご覧のとおり、2 つの値が選択されています ("Usuario" と "Invitado")。

Spring タグで「パス」が参照する「ロール」モデル属性は、単一の値ではなく配列になっています。それはそれと同じくらい簡単です。コントローラーで配列を手動で設定したことに注意してください。私はあなたのコードの ORM 側への影響に精通していません。

于 2014-12-13T05:46:17.900 に答える