обновить вложенный объект в Struts2 - PullRequest
1 голос
/ 21 марта 2011

С Struts2 он автоматически создаст bean-компонент в нашем действии через ognl, его легко использовать при создании нового объекта, например, на странице регистрации пользователя, мы создаем форму для использования, чтобы заполнить их информацию. и в действии мы получаем свойства заполненного компонента, мы можем сохранить его напрямую (возможно, потребуется некоторая проверка), это так просто.

Но как насчет обновления существующего объекта в БД?

Мы можем создать форму (предварительно заполнив свойства, которые могут быть обновлены на странице), когда пользователь вносит изменения, мы обновляем его.

Но компонент, который мы получаем в действии, создается Struts2 (мы называем этот компонент bean_struts2), и то, что мы хотим обновить, находится в БД (мы называем этот компонент bean_db).

Теперь проблема в том, как скопировать модификации bean_struts2 в bean_db?

Для не вложенного объекта мы можем выполнить итерацию всех свойств bean_struts2 и установить для него bean_db.

Например:

bean_db.setPassword(bean_struts2.getPassword());
.....

Но не так просто, когда обновляемый компонент является вложенным объектом.

В моем случае это сущности:

class Task{
    Object non_updatedProperty;
    List<TaskSteps> steps;
    List<User> managers;
    User publisher;
}
class User{
    id,name;
}
class TaskStep{
    id,name;
    List<Operator> operators;
    TaskStepStatus status;
}
enum TaskStepStatus{
    ongoing,completed.
}
class Operator{
    id,name;
}

Обновляемый компонент - это объект "Задача".

На странице:

<s:form action="task_update" namespace="/common" cssStyle="width:95%">
    <s:textfield value="%{task.id}" cssStyle="display:none" name="task.id"></s:textfield>
    <s:textfield value="%{task.publisher.name}" readonly="true" label="Publisher"></s:textfield>
    <s:textfield name="task.name" value="%{task.name}" label="Task Name"/>
    <table>
        <caption align="left">Steps</caption>
        <tr>
            <th>Step Name</th>
            <th>Operators</th>
            <th>Status</th>
            <th>Set order</th>
            <th><span id="addStep" style="cursor:pointer" >Add a step</span></th>
        </tr>
        <s:iterator value="task.steps">
            <tr class="step">
                <td>
                    <s:textfield name="task.steps[0].name" value="%{#this.name}" theme="simple"/>
                    <s:textfield name="task.steps[0].id" value="%{#this.id}" theme="simple" cssStyle="display:none"/>
                </td>
                <td><s:textfield name="task.steps[0].end" value="%{#this.end}" theme="simple"/></td>
                <td>        
                    <s:select list="allOpIndb"  listKey="id" listValue="name" value="%{#this.operator.{id}}"
                        name="task.steps[0].operator.id" multiple="true" theme="simple" id="a">
                    </s:select>
                </td>
                <td>
                    <s:select list="@com.zjswkj.location.entity.TaskStepStatus@values()"  theme="simple" 
                        name="task.steps[0].status" listValue="cnValue" value="%{#this.status}" id="b"/>
                </td>
                <td>
                    <span class="up">up</span>
                    <span class="down">down</span>
                    <span class="del">del</span>
                </td>
                <td></td>
            </tr>
        </s:iterator>
    </table>
</s:form>

С помощью struts2 я могу получить bean_strtus2 (Task), его идентификатор совпадает с bean_db. Я могу легко скопировать его не вложенные свойства в bean_db. но как насчет свойств его TaskSteps и операторов его TaskSteps.

Просто используйте:

task_db.setTaskSteps(task_struts2.getTaskSteps());??

Конечно нет, это может привести к тому, что какой-то новый TaskStep с тем же именем будет сохранен в БД.

Кроме того, некоторые свойства не могут быть обновлены, например, свойство Task «non_updatedProperty» не может быть обновлено, его можно установить только при создании задачи.

Итак, в форме обновления я не предоставил пользовательский интерфейс для обновления этого свойства, поэтому, если мы вызовем:

task_db.setNon_updateProperty(task_struts2.getNon_updateProperty); 

пропустит существующее свойство, потому что

task_struts2.getNon_updateProperty==null; !!!

Мне просто интересно, есть ли какие-нибудь хорошие идеи для обработки этих типов обновлений?

Я не совсем уверен, что вы, ребята, знаете, что я имею в виду, но я изо всех сил стараюсь выразить это.

Если есть еще вопросы, я могу обновить их.

1 Ответ

2 голосов
/ 22 марта 2011

О вопросе эффективной передачи информации из «структуры» (вложенного набора bean-компонентов), управляемой на уровне представления (так сказать, здесь, заполняемой Struts2), в другую «структуру» в службе или «БД»Уровень, я предлагаю серьезно взглянуть на http://dozer.sourceforge.net

О проблеме передачи изменения значения "структуры" с этого момента в БД через уровень представления, это сильно зависит от того, как вы отображаетеваши таблицы БД (я полагаю, вы используете какую-то реляционную базу данных) для объектов.

При использовании, например, Hibernate, иногда можно просто создать POJO прямо из ваших компонентов представления и сообщить Hibernate:"сохранить его";Hibernate будет создавать / обновлять / удалять соответствующие записи в таблице в соответствии с переданной структурой.Хотя в большинстве случаев не существует «серебряной пули», и требуется какое-то сравнение структур между структурой, отображаемой из содержимого БД, и структурой, отображаемой из уровня представления (например, через бульдозер), чтобы угадать, что необходимо добавить, изменить илиИсключен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...