2016-12-13 3 views
0

私は現在、サードパーティの請負業者によって構築されたレガシープロジェクトに取り組んでいます。これは、SpringとMyBatisを使用してMySQLサーバーと通信するJavaサーバーです。Spring DTOの仕組みを理解できない

私は、CamelCaseとアンダースコアの両方を含むDTO getters/setterでいくつかの醜いメソッド名をリファクタリングしようとしています。私は例としてgetCommon_name()メソッドを使用します。名前をgetCommonName()に変更すると、そのメソッドのデータベース検索が機能しなくなります。私は、メソッドが呼び出されたコード内のオカレンスを見つけるためにテキスト検索を試みましたが、DTO定義内にしか存在しないようです。データベースに自動的にマッピングされている可能性もあります。その方法はcommon_nameというテーブルを検索しますが、それはわかりません。

何が起きているのか、誰にでも分かりますか?これはSpring/MyBatisを初めて使ったときです。詳細と

編集:

の答えはこれまでのところ、私のマッピングが設定されているかについて尋ねてきました。

mybatis-config.xml

<configuration> 
    <typeAliases> 
    <typeAlias type="com.example.dto.SpeciesDTO" alias="species" /> 
    <!--aliases for other DTOs--> 
    </typeAliases> 

    <mappers> 
    <mapper resource="com/example/dao/species/speciesSQL.xml" /> 
    <!--aliases for other DAOs--> 
    </mappers> 
</configuration> 

mybatis-context.xml

<beans> 
    <bean id="SpeciesDao" class="org.mybatis.spring.mapper.MapperFactoryBean"> 
    <property name="mapperInterface" 
     value="com.example.dao.species.SpeciesDAO" /> 
    <property name="sqlSessionFactory" ref="sqlSessionFactory" /> 
    </bean> 
    <!--beans for other DAOs--> 
</beans> 

また、DAOはすべて、このような何かを見て.xmlファイルを関連付けられているファイル:

それはこのようなものが見えます
<mapper namespace="com.example.species.speciesDAO"> 
    <select id="getSpecies" parameterType="String" resultType="species"> 
    SELECT * FROM SPECIES 
    </select> 
    <!--other methods executing SQL--> 
</mapper> 

私は、DAOメソッドがどのようにDTO getters/setterを明示的にマップするか見ていません。たとえば、メソッドgetCommon_name()を検索すると、DTO自体の定義と、自分のサービスの1つでそのメソッドへの呼び出しが発生します(メソッドの名前を変更するときに両方の出現を確実に編集しました)。すべてのメソッドは、common_nameというプロパティを返します。

+0

DTOと注釈/マッピングファイルが表示されていないとわかりにくいです。あなたのように、あなたのフィールド名に基づいてマッピングを自動化することができます。 – yogidilip

+0

事実ですが、フルプロジェクトのテキスト検索では、もし存在すれば、私が変更したメソッドへのマッピングが返されているはずです。私のコードの外のどこかでマッピングが起こっているようです。 – Ecliptica

答えて

0

名前の規則を設定しているmybatis-config.xmlまたは他のxmlマッピングファイルはありますか?例えば、hereから:

<mapper namespace="org.podcastpedia.dao.PodcastDao"> 
<!-- result maps  --> 
<resultMap id="podcastsMap" type="Podcast" > 
    <id column="podcast_id" property="podcastId" /> 
    <result column="url" property="url" /> 
    <result column="rating" property="rating" /> 
    <result column="numberRatings" property="number_ratings" /> 
    <result column="number_visitors" property="numberOfVisitors" /> 
    <result column="DESCRIPTION" property="description" /> 
    <result column="PODCAST_IMAGE_URL" property="urlOfImageToDisplay" /> 
    <result column="TITLE" property="title" /> 
    <result column="last_episode_url" property="lastEpisodeMediaUrl" /> 
    <result column="title_in_url" property="titleInUrl" /> 
    <result column="publication_date" property="publicationDate"/> 
</resultMap> 
+0

元の質問に自分の設定を追加しました。私はDAOのメソッドマッピングを含む他のXMLファイルを参照する 'mybatis-config.xml'を持っていますが、DTOのためのそのようなマッピングはないようです。 – Ecliptica

0

ようにHibernate、MyBatisのは、クラスとフィールドがどのデータベーステーブルにマップするかを定義するXMLファイルを使用して永続化フレームワークです。

Javaでそのメソッドの名前を変更すると、XMLファイルで定義されているマッピングが壊れてしまいます。その後

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE mapper 
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 
<mapper namespace="org.mybatis.example.BlogMapper"> 
    <select id="selectBlog" resultType="Blog"> 
    select * from Blog where id = #{id} 
    </select> 
</mapper> 

Java実装を、これを呼び出すために:たとえば、このマッピングファイルは、SQLを選択する定義

Blog blog = session.selectOne("org.mybatis.example.BlogMapper.selectBlog", 101); 

は場合は、Javaコードで、あなたはselectMyBlogにselectBlogに改称し、更新されませんでしたあなたはおそらくNoClassDefFoundErrorを得るでしょう。テキスト検索ですべての.javaファイルと.xmlなどのJava以外のファイルが含まれていることを確認してください。

また、どのIDEを使用しているかは言いませんでしたが、HibernateがIDEAとEclipseの両方のプラグインを提供していることを知っています。 MyBatisプラグインもありますので、このマッピングを扱いやすくなります。

+0

私はいくつかの.xmlマッパーを持っていますが、それらはDAOにのみ適用され、DTOには適用されません。テキスト検索を行って、変更したメソッドへの参照がプロジェクト内に存在するかどうかを確認しましたが、DTO自体には唯一の出現しかありませんでした。 – Ecliptica

+0

「get」接頭辞を付けずにこれを検索するとどうなりますか? getCommon_nameまたはgetCommonNameの代わりにCommon_nameまたはCommonName?たぶんgetterはフィールド名に基づいて動的に生成されたメソッド名を持っていますか? – AWT

+0

私は実際に同じ考えを持っていましたが、大文字と小文字を区別する検索では 'getCommon_name'インスタンスのみが返され、大文字と小文字を区別しない場合はSQL呼び出しが返されます。私はまた、メソッド名がデータベースに直接マップされている可能性があると考えました(たとえば 'commonCommon_name'という名前の' common_name'という名前の列があります)。 'getUserName'は' user_name'という名前の列を参照します。 – Ecliptica

関連する問題