[s2container-php5:116] Re: コメントアノテーション使用時の複数キーでの N:1 マッピングについて

Yusuke Hata [E-MAIL ADDRESS DELETED]
2008年 1月 9日 (水) 00:52:09 JST


ハタです。
反応が遅れてしまいました。すいません。

パッチ提供ありがとうございます。

現在、S2Dao.PHP5の修正を行っている部分がいくつも溜まっ 
てきているので
次回リリースに提供されたコードを盛り込もうと思います。
次回リリース次期が未定ですが、なるべく早くに提供できるように 
します。

以上です、よろしくお願いします。
-- 
Yusuke Hata <[E-MAIL ADDRESS DELETED]>
blog: http://blog.xole.net/


On 2007/12/29, at 0:14, Shinya Tsuda wrote:

> はじめまして、津田と申します。
>
> 現在、担当プロジェクトで S2Dao.PHP5 を利用させていた 
> だいておりますが、
> 表題の件について、不具合と思われる部分を見つけましたので報 
> 告します。
>
> リファレンス (http://s2dao.php5.seasar.org/ 
> reference.html#N1Mapping) を
> 参照し、以下のような定義を含むエンティティを作成しました。
>
>    /**
>     * @Relation(relationNo = 0, relationKey = "sysid, subsysid")
>     */
>    public $subsystem;
>
>    public function getSubsystem() {
>        return $this->subsystem;
>    }
>
>    public function setSubsystem(Subsystem $subsystem) {
>        $this->subsystem = $subsystem;
>    }
>
> 対応する DAO で DB にアクセスしようとすると以下 
> のような例外が発生しました。
>
>    array and hash can not mix.
>        [ @Relation(relationNo = 1, relationKey = "sysid, subsysid")  ]
>        [ subsysid" ]
>
> 調査したとこ 
> ろ、S2DaoAnnotationReader#getAnnotationObject() で
> アノテーションをオブジェクトにするため、文字列を , で  
> explode() した際に
> " で囲われた部分が分割されてしまうことが原因と分かりました。
>
> また、結果セットからマッピングを構成する際に、エンティティ 
> が正しく
> マップされない不具合も発見しました。
> こちらは、S2Dao_RelationKey#__construct() で生成されるハッ 
> シュの
> コリジョンが原因であることがわかりました。
>
> どちらの事象も、添付のパッチのとおり修正して解決しました。
> 修正に問題がないようであればリリースに盛り込んでいただきた 
> いと思います。
>
> ご検討、よろしくお願いします。
>
> -- 
> Shinya Tsuda
> [E-MAIL ADDRESS DELETED]
>
> diff -Nru S2Dao-dist/S2Dao/S2DaoAnnotationReader.class.php S2Dao/ 
> S2Dao/S2DaoAnnotationReader.class.php
> --- S2Dao-dist/S2Dao/S2DaoAnnotationReader.class.php	2007-12-28  
> 14:22:56.000000000 +0900
> +++ S2Dao/S2Dao/S2DaoAnnotationReader.class.php	2007-12-28  
> 10:32:22.000000000 +0900
> @@ -112,6 +112,15 @@
>                 $argType = self::ARGS_TYPE_HASH;
>             } else {
>                 $items = S2Dao_ArrayUtil::spacetrim(explode(',',  
> $matches[2]));
> +
> +                for ($i = 0; $i < count($items); $i++) {
> +                    if (preg_match_all('/"/', $items[$i],  
> $_matches) % 2) {
> +                        $items[$i] .= "," . $items[$i + 1];
> +                        unset($items[$i + 1]);
> +                        $i--;
> +                    }
> +                }
> +
>                 foreach ($items as $item) {
>                     if (preg_match('/^(.+?)=(.+)/s', $item,  
> $matches)) {
>                         if ($argType == self::ARGS_TYPE_ARRAY) {
> diff -Nru S2Dao-dist/S2Dao/S2Dao_RelationKey.class.php S2Dao/S2Dao/ 
> S2Dao_RelationKey.class.php
> --- S2Dao-dist/S2Dao/S2Dao_RelationKey.class.php	2007-12-28  
> 14:22:56.000000000 +0900
> +++ S2Dao/S2Dao/S2Dao_RelationKey.class.php	2007-12-28  
> 14:20:29.000000000 +0900
> @@ -31,10 +31,7 @@
>
>     public function __construct($values) {
>         $this->values_ = $values;
> -        $c = count($values);
> -        for ($i = 0; $i < $c; ++$i) {
> -            $this->hashCode_ += crc32($values[$i]);
> -        }
> +        $this->hashCode_ = crc32(var_export($values, true));
>     }
>
>     public function getValues() {
> _______________________________________________
> S2Container-PHP5 mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/s2container-php5



S2Container-PHP5 メーリングリストの案内