Comments inline. Overall, you seem to have made this much more complicated than it needs to be. Looking at your database schema from your original message, all the table columns are simple strings or number, except for the gender enum. But you've elected to make every column a distinct object type. That is why your solution is more complex than you might wish.

Because you've elected to transform every column into a distinct object type, you have to tell iBATIS what those object types are. It can't possibly guess at such things. And that is why you are having to specify all the javaType's. If you would have used simple strings and numbers, you would not have to do so.

On 1/2/2010 5:51 PM, Dan Forward wrote:

Thank you, Guy, you have been a big help!

This is what I came up with. It works, but not as well as I had hoped.

<resultMap type="User" id="userMap">
        <constructor>
                <idArg column="id" javaType="UserID" 
typeHandler="UserIDHandler"/>
                <arg column="gender" javaType="Gender" 
typeHandler="GenderHandler"/>
                <arg column="email" javaType="EmailAddress"
typeHandler="EmailAddressHandler"/>
                <arg column="phone" javaType="TelephoneNumber"
typeHandler="TelephoneNumberHandler"/>
                <arg column="birth_date" javaType="LocalDate"
typeHandler="LocalDateHandler"/>
                <arg column="password_hash" javaType="SHA1" 
typeHandler="SHA1Handler"/>
                <arg column="avatar_id" javaType="StaticFileID"
typeHandler="StaticFileIDHandler"/>
                <arg column="organization_id" javaType="OrganizationID"
typeHandler="OrganizationIDHandler"/>
                <arg column="version" javaType="int"/>
        </constructor>
        <association property="name" javaType="Name">
                <constructor>
                        <arg column="first_name" javaType="String"/>
                        <arg column="middle_name" javaType="String"/>
                        <arg column="last_name" javaType="String"/>
                        <arg column="suffix" javaType="String"/>
                </constructor>
        </association>
</resultMap>

I was surprised that I had to specify the javaType for every parameter.
Otherwise, iBATIS treated everything as an Object and could not find a
corresponding constructor. I then discovered that iBATIS was looking for an
Integer argument for the version even though I specified the javaType to be
an int. Finally, I had to remove name from the constructor since constructor
tags do not support child association tags.

Already discussed the need for all the javaType's. I don't know about the int; I've used them successfully without issue. I don't understand what you mean by "I had to remove name from the constructor"; I don't see a column called "name" in your table.


As a side note, I try to follow the recommendation by Joshua Bloch in
Effective Java to use static factory methods instead of constructors, so I
only have private constructors. I used DefaultObjectFactory as a model to
create my own ObjectFactory that first looks for a matching static factory
method before looking for a constructor.

I just use JavaBeans instead of trying to do all the data filling from the constructor. iBATIS will use the empty constructor automatically. Any particular reason you want to do the data assignments via constructors?


One of the reasons I chose iBATIS was that Hibernate put too many
constraints on my domain model. It isn't really a POJO if you say it has to
have a public constructor, an empty constructor, and setters for every
property. iBATIS is less strict, but still has some hoops to jump through.
Wouldn't it be nice to have a persistence layer that transparently
accommodated the domain model? What if I wanted to use a separate Factory
class to create my User objects?

Look at page 14 in the documentation. You can supply your own ObjectFactory.

As you've discovered, no persistence layer is perfect. Unless you write your own, every pre-packaged persistence approach will have some compromises in order to appeal to a significantly large audience.

If you Google, you'll find several articles comparing Hibernate, JPA and iBATIS. If you are starting from scratch and have complete control over both your database implementation and your Java frameworks, then something like Hibernate might be appropriate. In our situation, we have a pre-existing, not-well-normalized database; iBATIS removes all the grunt work but still allows us complete control over how we access our data.

--
Guy Rouillier

---------------------------------------------------------------------
To unsubscribe, e-mail: user-java-unsubscr...@ibatis.apache.org
For additional commands, e-mail: user-java-h...@ibatis.apache.org

Reply via email to