What do you think if I register an enhancement and then attach a patch if
the new feature which will fix this problem?
In short I will add new enumeration in ValueStrategies. The new enumeration
will be named CUSTOM or GENERIC or another name. Then I will do the relevant
changes in the code. Then in the switch statement will be one more case as
follow:
switch (strategy)
{
case ValueStrategies.SEQUENCE:
case ValueStrategies.UUID_STRING:
case ValueStrategies.UUID_HEX:
case ValueStrategies.CUSTOM:
default:
}
Miro.
On 12/18/07, Miroslav Nachev <[EMAIL PROTECTED]> wrote:
>
> Hi,
>
> From this mail I understand that the only way in OpenJPA to create Custom
> Identifier is using "Sequence" like that:
> @Id
> @Column(name = "Data_Object_Id", nullable = false)
> @SequenceGenerator(name="DataObjectsSeq", sequenceName="
> test.DataObjectsGenerator")
> @GeneratedValue(strategy=GenerationType.SEQUENCE,
> generator="DataObjectsSeq")
> private BigDecimal dataObjectId;
>
> In my test case I am using MySQL which doesn't support Sequences in
> principal and maybe this is a problem. It seams that if the database doesn't
> support Sequences it is not possible to create Generic Generated Value. But
> this is not the expected behavior because it is possible to create
> UUID_STRING and UUID_HEX which are not part of any databases. When I look at
> the code I see the following code in class ImplHelper.java:
> private static Object generateValue(StoreContext ctx, ClassMetaData
> meta, FieldMetaData fmd, int typeCode)\
> {
> ...
> switch (strategy)
> {
> case ValueStrategies.SEQUENCE:
> ...
> return JavaTypes.convert(seq.next(ctx, meta), typeCode);
> break;
> case ValueStrategies.UUID_STRING:
> return UUIDGenerator.nextString();
> case ValueStrategies.UUID_HEX:
> return UUIDGenerator.nextHex();
> default:
> return null;
> }
> }
>
> When I try to create Generic Generated Value using Sequence in database
> which doesn't support Sequences I have exception.
> Somebody tell me that I have to use last_insert_id as follow:
> dbDict.nextSequenceQuery = "SELECT LAST_INSERT_ID()"
> I do that but then nobody invoke my class test.DataObjectsGenerator os
> some of it methods.
>
> From the above code and my tests it seems that theoretically is not
> possible to have custom (generic) Generated Value using database which
> doesn't support sequences.
> Is that a bug? Do you have any idea how to solve it?
>
> Finally I can replace the database with PostgreSQL but the problem will
> not be solved and will still exists.
>
>
> Regards,
> Miro.
>
>
>
> Patrick Linskey wrote:
>
> If you want it to be globally available, you can make it the default
> implementation for use by @GenerationType.SEQUENCE by specifying it in
> the openjpa.Sequence property.
>
> If you want to use it in just some circumstances, or want to use
> different configurations / instances for different types, then you can
> set up named sequences as per the examples in the section I pointed
> you to earlier, and then list the class name in the value. The example
> would look like so:
>
> @SequenceGenerator(name="MyCustomSeq", sequence="fully.qualified.ClassName")
>
> Or, if you wanted to set some configuration options on the instance:
>
> @SequenceGenerator(name="MyCustomSeq",
> sequence="fully.qualified.ClassName(InitialValue=5,BitLength=32")
>
> This would work provided that your class had methods called
> setInitialValue() and setBitLength(), or public fields with those
> names, or implemented the GenericConfigurable interface.
>
> Similarly, the syntax for specifying a sequence globally via the
> openjpa.Sequence setting would look like so:
>
> <property name="openjpa.Sequence" value="fully.qualified.ClassName"/>
>
> OpenJPA configuration settings that can implement a particular
> interface use this format plus more-friendly aliases quite frequently.
>
> -Patrick
>
> On Nov 5, 2007 1:21 PM, Miroslav Nachev <[EMAIL PROTECTED]> <[EMAIL
> PROTECTED]> wrote:
>
> The implementation of Seq interface is the easiest part of the task. I can
> not see how to configure JPA to use my Seq implementation instead of the
> standard. Can I do that with annotation or I have to use another tricks?
>
>
> Miro.
>
> On 11/5/07, Patrick Linskey <[EMAIL PROTECTED]> <[EMAIL PROTECTED]> wrote:
>
> Gotcha. To do that, you'll need to implement the
> org.apache.openjpa.kernel.Seq interface. Take a look at the docs [1]
> for details. That section of the docs also has some examples that
> should help you use your custom sequence.
>
> [1]
> http://openjpa.apache.org/docs/latest/manual/manual.html#ref_guide_sequence
>
> -Patrick
>
> On Nov 5, 2007 1:01 PM, Miroslav Nachev <[EMAIL PROTECTED]> <[EMAIL
> PROTECTED]> wrote:
>
> No. I want to have my own class with which to generate the Ids.
> For example I have binary(32) field which is the Primary Key. I would
>
> like
>
> to generate the values for this PK in my own way.
>
>
> Miro.
>
>
> On 11/5/07, Patrick Linskey <[EMAIL PROTECTED]> <[EMAIL PROTECTED]> wrote:
>
> Hi,
>
> Can you describe what you mean by a "generic" GeneratedValue? Do you
> mean that you'd like to use the @GeneratedValue annotation on
> non-identity fields? If so, then that is possible in OpenJPA.
>
> -Patrick
>
> On Nov 5, 2007 12:08 PM, Miroslav Nachev <[EMAIL PROTECTED]> <[EMAIL
> PROTECTED]> wrote:
>
> Hi,
>
> Is there any way to have Generic GeneratedValue in OpenJPA. I know
>
> that
>
> this
>
> is possible in Hibernate JPA but I would like to use OpenJPA if is
>
> possible.
>
> Any suggestions?
>
>
> Regards,
> Miro.
>
> --
> Patrick Linskey
> 202 669 5907
>
> --
> Patrick Linskey
> 202 669 5907
>
>
>
>