• Type: Bug
    • Resolution: Fixed
    • Priority: Major
    • 2.4.39
    • Affects Version/s: 2.4.38
    • Component/s: S2JDBC
    • None

      テーブルparent、childがあり、child(as 子1)⇒parent(as 親)⇒child(as 子2) という結合を行った状況において、親がもつ子2リストに子1で取得したEntityが含まれる場合、子1が重複して取得されてしまいます。*To*EntityMapperImpで重複して追加することが原因に思えます。

      作成したテーブルは以下です。

      create table parent (
          id  number,
          name varchar2(20),
          primary key (id)
      );
      
      create table child (
          id number,
          parent_id number,
          name varchar2(20),
          primary key (id),
          foreign key (parent_id) references parent (id)
      );
      
      insert into parent values (1, '親その1');
      insert into child values (1, 1, '子その1');
      insert into child values (2, 1, '子その2');
      

      実行したメソッドは以下です。

              List<Child> childList =
                  jdbcManager.from(Child.class).innerJoin("parent").innerJoin(
                      "parent.childList").id(1).getResultList();
      

      childList.get(0).parent.childList で子その1が重複します。

          [CONTAINER-381] [S2JDBC] 1 対多および多対 1 関連で自己結合した場合,1 対多関連に重複するエンティティが設定される問題を修正しました.

          koichik added a comment -

          koichik added a comment - 対応しました. http://svn.seasar.org/browse/?view=rev&root=s2container&revision=4368

          shinsuke added a comment -

          添付できないようなので、パッチを貼り付けます。
          (もっと良い修正方法があればそちらで・・・)

          Index: src/main/java/org/seasar/extension/jdbc/mapper/ManyToOneEntityMapperImpl.java
          ===================================================================
          — src/main/java/org/seasar/extension/jdbc/mapper/ManyToOneEntityMapperImpl.java (revision 4367)
          +++ src/main/java/org/seasar/extension/jdbc/mapper/ManyToOneEntityMapperImpl.java (working copy)
          @@ -60,9 +60,10 @@
          if (list == null)

          { list = new ArrayList(); FieldUtil.set(inverseField, entity, list); - + list.add(target); + }

          else if (!list.contains(target))

          { + list.add(target); }
          • list.add(target);
            }
            }

          Index: src/main/java/org/seasar/extension/jdbc/mapper/OneToManyEntityMapperImpl.java
          ===================================================================
          — src/main/java/org/seasar/extension/jdbc/mapper/OneToManyEntityMapperImpl.java (revision 4367)
          +++ src/main/java/org/seasar/extension/jdbc/mapper/OneToManyEntityMapperImpl.java (working copy)
          @@ -53,14 +53,15 @@
          @SuppressWarnings("unchecked")
          @Override
          protected void mapRelationship(Object target, Object entity) {

          • List list = (List) FieldUtil.get(field, target);
          • if (list == null) { - list = new ArrayList(); - FieldUtil.set(field, target, list); - - }

            if (entity != null) {

          • list.add(entity);
            + List list = (List) FieldUtil.get(field, target);
            + if (list == null) { + list = new ArrayList(); + FieldUtil.set(field, target, list); + list.add(entity); + }

            else if (!list.contains(entity))

            { + list.add(entity); + }

            if (inverseField != null)

            { FieldUtil.set(inverseField, entity, target); }

          shinsuke added a comment - 添付できないようなので、パッチを貼り付けます。 (もっと良い修正方法があればそちらで・・・) Index: src/main/java/org/seasar/extension/jdbc/mapper/ManyToOneEntityMapperImpl.java =================================================================== — src/main/java/org/seasar/extension/jdbc/mapper/ManyToOneEntityMapperImpl.java (revision 4367) +++ src/main/java/org/seasar/extension/jdbc/mapper/ManyToOneEntityMapperImpl.java (working copy) @@ -60,9 +60,10 @@ if (list == null) { list = new ArrayList(); FieldUtil.set(inverseField, entity, list); - + list.add(target); + } else if (!list.contains(target)) { + list.add(target); } list.add(target); } } Index: src/main/java/org/seasar/extension/jdbc/mapper/OneToManyEntityMapperImpl.java =================================================================== — src/main/java/org/seasar/extension/jdbc/mapper/OneToManyEntityMapperImpl.java (revision 4367) +++ src/main/java/org/seasar/extension/jdbc/mapper/OneToManyEntityMapperImpl.java (working copy) @@ -53,14 +53,15 @@ @SuppressWarnings("unchecked") @Override protected void mapRelationship(Object target, Object entity) { List list = (List) FieldUtil.get(field, target); if (list == null) { - list = new ArrayList(); - FieldUtil.set(field, target, list); - - } if (entity != null) { list.add(entity); + List list = (List) FieldUtil.get(field, target); + if (list == null) { + list = new ArrayList(); + FieldUtil.set(field, target, list); + list.add(entity); + } else if (!list.contains(entity)) { + list.add(entity); + } if (inverseField != null) { FieldUtil.set(inverseField, entity, target); }

            Assignee:
            koichik
            Reporter:
            shinsuke
            Votes:
            0 Vote for this issue
            Watchers:
            Start watching this issue

              Created:
              Updated:
              Resolved: