Re: Driver matching with SDriver.driverName
Ryan Boder <[email protected]> Thu, 1 Oct 2009 14:50:31 -0400
| Newsgroups | gmane.comp.java.orm.simpleorm |
|---|---|
| Message-ID | <[email protected]> |
Hi Anthony, I'm working on a production level project on a deadline, not experimental. It occurred to me that I can't afford to deal with Derby not being currently supported since other problems may appear later. I picked Derby because of JavaDB and because I read that HSQLDB could leave you in an inconsistent state if the system crashes. Has H2 solved that problem? What DB do you primarily develop SimpleORM with? If I want to use SimpleORM for robust, easy to use Java persistence with no modifications required, what DB should I use? (preferably a Java embedded DB) Thanks, Ryan On Tue, Sep 29, 2009 at 6:12 AM, <[email protected]> wrote: > > > Yes, you are right, more to do. > > Not important, but I think that I like to see the keyword DEFAULT generated > -- makes it explicit. > > You could do what I suggested, but then also change SDriver.insertSql to > call a new insertValue(SFieldScalar) which by default just creates ?. But > then in Derby driver you override this to check for generated and output > DEFAULT instead. > > It is a little bit fiddly. But either approach would be OK. > > You get the general drift though. Put hooks in the mainline code, and then > override in your driver. Minimize per database complications in the mainline > code. > > (A pain that the SQL does not standardize the most basic funtionality of > key generation! It has lots of other escoterics, and SQL 3 for objects is > bad. Also a pain that Sun chose Derby rather than Dafodil or maybe H2 as the > Java database.) > > Regards, > > Anthony > > > At 06:55 PM 29/09/2009, you wrote: > > > > > >Hi Anthony, > > > >I read the code and I think this will require the flush method to work a > differently for generated columns. It currently passes the NULL values for > generated columns as parameters in a prepared statement. This doesn't work > with Derby because Derby expects the keyword DEFAULT to be passed instead. > The keyword DEFAULT can not be passed as a parameter to a prepared > statement. Derby can handle the follow three syntax in a prepared > statement... > > > >(*** got this from < > http://objectmix.com/apache/646246-can-derby-have-sequence-column.html> > http://objectmix.com/apache/646246-can-derby-have-sequence-column.html***) > > > >""" > >The DEFAULT <http://objectmix.com/#>keyword is part of < > http://objectmix.com/#>SQL, not ij. These SQL statements should > >all work in <http://objectmix.com/#>JDBC > >[] > ><http://objectmix.com/#> > >as a PreparedStatement > > > >INSERT INTO GROUPS(ID, NAME, DESCRIPTION) VALUES (DEFAULT, ?, ?) > > > >INSERT INTO GROUPS(NAME, DESCRIPTION) VALUES (?, ?) > > > >INSERT INTO GROUPS VALUES (DEFAULT, ?, ?) > >""" > > > >So I think I'm going to have to change code a little earlier in the flush > method, from line 186 to line 236, so it doesn't handle generated columns as > parameters in the prepared statement, but rather as literals in the query > itself. For Derby the literal would be DEFAULT and for MSSQL and HSQL it > would be NULL - that decision being delegated to the driver. > > > >Another option I considered was simply not specifying a value for > generated columns as you can see in the second syntax example above, but if > I'm thinking that does not work in MSSQL. Not 100% sure though. > > > >Before I go forward, what are your thoughts? Is this the correct approach > (changing defaults to literals instead of prepared statement parameters) in > your design or do you have a better suggestion? > > > >Thanks, > >Ryan > > > > > >On Mon, Sep 28, 2009 at 3:11 AM, <<mailto:[email protected]<anthony%40berglas.org> > >[email protected] <anthony%40berglas.org>> wrote: > >Â > > > >Hello Ryan, > > > >Could do. But for now just create subclasses for the different variants. I > suggest just use a static class for these trivial bits. There may even be > some real differences later. > > > >(The bigger problem is that SDrivers represent both the instance and the > factory. Should be a small static factory class for the factory. Just has > never got to the top of the list to fix.) > > > >It would be very good to support Deryb/JavaDB. (I'm not clear about the > difference?). This is long overdue. And it should build and run Derby out of > the JDK 1.6 directly, with their jars. Maybe even make Derby the default > test DB instead of HSQL? > > > >The normal way to handle database inconsistencies is to delegate them to > some method in the SDriver hierarchy. Null works for MSSQL and HSQL. > > > >In SSessionJdbcHelper.flush you would have to change > >if (value == null && fieldMeta.isPrimary() && theGenerator==null) > >throw new SException.Error("Null primary key not set (after > createWithNullKey) " + instance); > >fieldMeta.writeFieldValue(ps, jx, instance.getRawArrayValue(fieldMeta)); > > > >into something like > > > >if (value == null && fieldMeta.isPrimary()) > >if (theGenerator==null) > >throw new SException.Error("Null primary key not set (after > createWithNullKey) " + instance); > >else > >session.getDriver().setEmptyGeneratedKey() // Or maybe just do nothing > here? > >else > >fieldMeta.writeFieldValue(ps, jx, instance.getRawArrayValue(fieldMeta)); > > > >Make sure that whatever you do continues to work for at least HSQL, the > default test case. > > > >Send me any changed files and I'll diff and check them in. You are welcome > to become a committer if you make serious contributions. > > > >There is no magic in the code. You are not dependent on us to change > things, unlike more complex systems. > > > >Regards, > > > >Anthony > > > >>I'm trying to get identity generation on insert working with Derby. I > have the driver set up so it creates the table with GENERATED BY DEFAULT AS > IDENTITY for my identity field and it works fine. The problem occurs when I > call session.ses.createWithGeneratedKey and then try to commit the new > record. SimpleORM tries to call insert passing null for the identity field. > Derby accepts an insert statement that either 1) doesn't specify a value for > the identity column or 2) passes the value "default" for the identity > column. Derby throws an error when SimpleORM tries to pass null for the > generated column. > >> > >>How should I handle this? If there's no way then I'll have to change > SimpleORM code to pass "default" instead of "null" but I'd prefer not to do > that. > > > > > >At 01:00 PM 27/09/2009, you wrote: > >> > >> > >>Hi. > >> > >>Have you considered allowing 1 SimpleORM driver to handle multiple JDBC > drivers? Instead of using driverName and comparing the returned string to > choose a SimpleORM driver, you could pass the actual driver name into a > boolean method of an SDriver subclass and let the driver itself decide > whether it's a match. For example, I'm working with an embedded Derby > database and the driver name is "Apache Derby Embedded JDBC Driver" but the > driver name for the network client would be "Apache Derby Network Client > JDBC Driver". The same SimpleORM driver would probably work for both. > >> > >>Just curious, > >>-- > >>Ryan Boder > >>1 614 598 6339 > >> > > > >Dr Anthony Berglas, <mailto:anthony%40berglas.org<anthony%2540berglas.org> > >[email protected] <anthony%40berglas.org> Mobile: +61 4 4838 8874 > >Just because it is possible to push twigs along the ground with ones nose > >does not necessarily mean that is the best way to collect firewood. > > > > > > > > > >-- > >Ryan Boder > >1 614 598 6339 > > > > Dr Anthony Berglas, [email protected] <anthony%40berglas.org> Mobile: > +61 4 4838 8874 > Just because it is possible to push twigs along the ground with ones nose > does not necessarily mean that is the best way to collect firewood. > > -- Ryan Boder 1 614 598 6339