|
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]> 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]> 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]> wrote: |
- URGENT: Re: Generic (user) GeneratedValue Miroslav Nachev
- Re: URGENT: Re: Generic (user) GeneratedValue Miroslav Nachev
- Re: URGENT: Re: Generic (user) GeneratedValue Michael Dick
