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

Status: Resolved
Project: S2Container
Component/s: S2JDBC
Affects Version/s: 2.4.38
Fix Version/s: 2.4.39

Type: Bug Priority: Major
Reporter: shinsuke Assignee: koichik
Resolution: Fixed Votes: 0
Labels: None


 Description   

テーブル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が重複します。



 Comments   
Comment by koichik [ 2009-06-26 ]

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

Comment by shinsuke [ 2009-06-25 ]

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

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); }
Generated at Thu May 09 08:03:23 JST 2024 using Jira 9.15.0#9150000-sha1:9ead8528714127d8cfabf2446010d7e62c0a195c.