CheckBoxMultipleChoice store в SQL - PullRequest
       14

CheckBoxMultipleChoice store в SQL

0 голосов
/ 22 апреля 2011

Я использую метод wicket 1.3 CheckBoxMultipleChoice (), чтобы пользователь выбирал соответствующие команды для проекта. Когда я сохраняю список команды в базе данных, он сохраняется с использованием уникальных для этого сеанса идентификаторов, таких как: [info.tpath.domain.Team@1c3d514, info.tpath.domain.Team@1510241, info.tpath.domain.Team @ 1d26ddd, info.tpath.domain.Team@ea423e]. Есть ли способ перехватить список выбранных элементов, чтобы он сохранил идентификатор объекта, как в: Team.getId();? Любая помощь очень ценится ...

Я хочу сохранить список команд в виде строки в БД MS SQL08, используя hibernate.

    List<Team> choices = new ArrayList<Team>();
    for(int i=1;i<5;i++){
        for(Team team:getJtrac().findTeamGroup(i)){
            choices.add(team);
        }
    }
    CheckBoxMultipleChoice pcrTeamz = new CheckBoxMultipleChoice("pcrTeams", choices, new IChoiceRenderer() {
        public Object getDisplayValue(Object o) {
            return ((Team) o).getName();
        }
        public String getIdValue(Object o, int i) {
            long lTeam = ((Team) o).getId();
            return Long.toString(lTeam);
        }
    });
    add(pcrTeamz);

onSubmit () для формы ниже:

 @Override
    protected void onSubmit() {
        ManagementOfChange managementOfChange = (ManagementOfChange) getModelObject();
        managementOfChange.setStatus(status);
        managementOfChange.setProject(project);
        managementOfChange.setLoggedBy(getPrincipal());
        getJtrac().storeManagementOfChange(managementOfChange);
        setResponsePage( new ProjectPage(project, new ManagementOfChangeSubSectionPanel("projectSubSectionPanel",project)));
    }

В приведенном ниже методе storeManagementOfChange () dao.storeManagementOfChange (moc) просто вызывает getHibernateTemplate (). Merge (moc);

public void storeManagementOfChange(ManagementOfChange moc) {
        History history = new History(moc);
        Date now = new Date();
        moc.setTimeStamp(now);
        history.setTimeStamp(now);
        history.setLoggedBy(moc.getEnteredBy());
        if(history.getComment()==null){
            history.setComment("Creation of New PCR");
        }
        moc.add(history);
        SpaceSequence spaceSequence = dao.loadSpaceSequence(moc.project.getProjectId());
        moc.setPcrNum(spaceSequence.nextPcr());
        // the synchronize for this storeItem method and the hibernate flush() call in the dao implementation
        // are important to prevent duplicate sequence numbers
        dao.storeSpaceSequence(spaceSequence);
        //this call should not be required actually, but the cascase setting has some problem probably
        //because we are using a polymorphic association between a moc and history. that is why we
        //are explicitly saving history before actually saving the moc itself.
        dao.storeHistory(history);
        // this will at the moment execute unnecessary updates (bug in Hibernate handling of "version" property)
        // see http://opensource.atlassian.com/projects/hibernate/browse/HHH-1401
        // TODO confirm if above does not happen anymore
        dao.storeManagementOfChange(moc);
        indexer.index(moc);
        indexer.index(history);
        mailSender.send(moc, moc.isSendNotifications());
    }

И, наконец, отображения спящего режима приведены ниже:

 <class name="ManagementOfChange" table="management_of_change">
    <id column="id" name="id">
      <generator class="native"/>
    </id>
    <many-to-one column="project_id" index="idx_project_id" name="project" not-null="true"/>
    <property column="requester" name="requester"/>
    <property column="phase" name="phase"/>
    <property column="description" name="description"/>        
    <property column="third_party" name="thirdParty"/>
    <many-to-one column="entered_by" index="idx_user_id" name="enteredBy" not-null="true"/>
    <property column="internal_or_external" name="source"/>
    <property column="change_number" name="changeNum"/>
    <property column="pcr_number" name="pcrNum"/>
    <property column="milestone_affected" name="milestoneAffected"/>
    <property column="new_due_date" name="newDueDate"/>
    <property column="pcr_group_num" name="pcrGroupingNumber"/>
    <property column="pcr_title" name="pcrTitle"/>
    <property column="status" name="status"/>
    <property column="time_estimate" name="timeEstimate"/>
    <property column="teams" name="pcrTeams"/>
    <property column="timestamp" name="timestamp"/>
    <property column="sow" name="sow"/>
    <property column="req_date" name="reqDate"/>
  </class>

Ответы [ 2 ]

1 голос
/ 22 апреля 2011

Объект модели вашего CheckBoxMultipleChoice имеет значение List<Team>, а не List<Long>, поэтому вы сохраняете все объекты Team. Похоже, что ваши сущности не отображаются должным образом в вашей базе данных, если вообще.

Я думаю, у вас есть несколько вариантов:

  1. исправьте сопоставления JPA / JDO (предпочтительно)
  2. в вашей форме, не сохраняйте pcrTeamz.getModelObject(). Вместо этого извлеките идентификатор из каждого объекта Team и сохраните этот список.

Например:

List<Long> teamIds = new ArrayList<Long>();
for(Team team : pcrTeamz.getModelObject()) {
   teamIds.add(team.getId());
}
myBO.save(teamIds);
0 голосов
/ 22 апреля 2011

В конечном итоге решением было передать CheckBoxMultipleChoice a List, а не List.Затем список выбранных строк объединяется с базой данных вместо списка идентификаторов объекта сеанса.Мне никогда не удавалось извлечь объекты команды из CheckBoxMultipleChoice.Если кто-нибудь знает, как это сделать, мне было бы интересно.Спасибо!

    // associated team list =================================================
    List<String> choices = new ArrayList<String>(); //init as List<String>
    for(int i=1;i<5;i++){
        for(Team team:getJtrac().findTeamGroup(i)){
            choices.add(team.getName()); //extract team names to List<String>
        }
    }
    pcrTeamz = new JtracCheckBoxMultipleChoice("pcrTeams", choices, new IChoiceRenderer() {
        public Object getDisplayValue(Object o) {
            return o;
        }
        public String getIdValue(Object o, int i) {
            return o.toString();
        }
    });
    add(pcrTeamz);
...