openjpa-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Kevin Sutter" <kwsut...@gmail.com>
Subject Re: UUIDs
Date Wed, 30 Apr 2008 19:30:32 GMT
Nikolas,
Fair enough.  From my understanding of these Externalizers, I would define
your UUID field as follows:

   @Persistent
   @Column(nullable=false)
   @Externalizer("toString")        // non-static method
   @Factory("UUID.fromString")   // static method
   private UUID uuid;

OpenJPA should just use the UUID methods to go to and from the string
presentation.  The @ElementType annotation should not be necessary since you
don't seem to be processing a Collection of UUIDs.  These seem to be single
instances of UUIDs.

Have you tried this particular combination?  I haven't made the connection
between these changes and your specific error message, but let's make sure
we're consistent with our understanding.  Thanks.

Kevin

On Wed, Apr 30, 2008 at 2:09 PM, Nikolas Everett <nik9000@gmail.com> wrote:

> Kevin,
>
> Thanks for getting back to me.
>
> Thats a cool generator.  I might use that sometime.  Unfortunately, the
> UUIDs are keys into another system.  I'm just trying to get them to
> persist
> them into the database as string and load them into java as UUIDs.
>
> Thanks again,
>
> --Nik
>
> On Wed, Apr 30, 2008 at 2:57 PM, Kevin Sutter <kwsutter@gmail.com> wrote:
>
> > :-)  Quiet doesn't mean we're not busy...  :-)
> >
> > My first thought when I read your append is why are you not just using
> the
> > built-in UUID generator that OpenJPA provides?  OpenJPA allows you to
> use
> > a
> > generator on non-id fields.  We can either generate the UUID as a 16
> > character string or a 32 character hex value.  Would this usage suffice
> > for
> > you, or do you have some other requirements for the use of the
> > externalizer?
> >
> > Here's a link to the documentation on the UUID generator:
> >
> >
> http://openjpa.apache.org/docs/latest/manual/manual.html#jpa_overview_meta_gen
> >
> > Kevin
> >
> > On Wed, Apr 30, 2008 at 9:49 AM, Nikolas Everett <nik9000@gmail.com>
> > wrote:
> >
> > > I tried the attached message on the users list but didn't get any
> > > response.
> > > Will someone on the dev listserve help?  I'm researching an ORM
> solution
> > > for
> > > our company, and can't in good conscience pick one with quiet
> listservs.
> > > Thanks,
> > >
> > > --Nik
> > >
> > > ---------- Forwarded message ----------
> > > From: Nikolas Everett <nik9000@gmail.com>
> > > Date: Mon, Apr 28, 2008 at 5:20 PM
> > > Subject: UUIDs
> > > To: users@openjpa.apache.org
> > >
> > >
> > > I tried to search the archives and didn't find anything on this.  I'm
> > > using
> > > openjpa 1.0.2 and having problems with UUIDs backed into postgres 8.2.
> > >
> > > I have a class like:
> > > @Entity
> > > @Table(uniqueConstraints={@UniqueConstraint(columnNames="uuid")})
> > > public class Account {
> > >    @Id
> > >    @GeneratedValue(strategy=GenerationType.IDENTITY)
> > >    private int id;
> > >
> > >    @Persistent
> > >    @Column(nullable=false)
> > >    @Externalizer("java.util.UUID.toString")
> > >    @Factory("java.util.UUID.fromString")
> > >    @ElementType(UUID.class)
> > >    private UUID uuid;
> > >
> > > ...getters and setters...
> > > }
> > >
> > > The uuid column is created as a character varying 255, which is fine
> for
> > > now.
> > >
> > > I  have a method like this:
> > >    protected Account getAccountByUuid(UUID uuid) {
> > >        Query findAccount = this.em.createQuery("SELECT a FROM Account
> a
> > > WHERE a.uuid = ?1");
> > >        findAccount.setParameter(1, uuid);
> > >        try {
> > >            return (Account) findAccount.getSingleResult();
> > >        } catch (NoResultException e) {
> > >            Account account = new Account();
> > >            account.setUuid(uuid);
> > >            this.em.persist(account);
> > >            return account;
> > >        }
> > >    }
> > >
> > > Which throws an exception like this:
> > > Exception in thread "main" <openjpa-1.0.2-r420667:627158 nonfatal user
> > > error> org.apache.openjpa.persistence.ArgumentException: The parameter
> > "0"
> > > is of type "java.util.UUID", but the declaration in the query is for
> > type
> > > "java.lang.String".
> > >    at
> > >
> > >
> >
> org.apache.openjpa.persistence.QueryImpl.validateParameter(QueryImpl.java:270)
> > >    at
> > >
> > >
> >
> org.apache.openjpa.persistence.QueryImpl.validateParameters(QueryImpl.java:250)
> > >    at
> > org.apache.openjpa.persistence.QueryImpl.execute(QueryImpl.java:231)
> > >    at
> > >
> > >
> >
> org.apache.openjpa.persistence.QueryImpl.getSingleResult(QueryImpl.java:300)
> > >    at com.companyname.Classname.getAccountByUuid(FetchData.java:73)
> > >
> > > This isn't the behavior documented here:
> > >
> > >
> >
> http://openjpa.apache.org/docs/latest/manual/ref_guide_pc_scos.html#d0e21916
> > >
> > > What can I do?
> > >
> > > Thanks in advance,
> > >
> > > --Nik
> > >
> >
>

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message