views:

421

answers:

1

Hello,

I have a class mapped as an Entity to persist it in a database. I have an id field as the primary key so every time the object is persisted the value of the id is retrieved from the sequence "myClass_pk_seq", a code like the following one.

@Entity
@Table(name="myObjects")
public class MyClass {
    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="sequence")
    @SequenceGenerator(name="sequence", sequenceName="myClass_pk_seq", allocationSize=1)
    @Column(name="myClassId")
    private Integer id;

    private Integer code;


    ...
}

I need to make in "code" attribute something similar to id. I need to have a sequence so I can assign to code the next value of the sequence (to reserve that value in case the user wants to reserve it but without persisting data). I mean the user will see the field, if he doesn't know what to enter he can push a button and receieve in the screen the next possible value (and he can or not accept it). How can I get the next value of a sequence defined in JPA (and increment its value) without persisting the data for a non primary key field?

I just want to have a method which call nextval on a sequence associated with "code" field, and returns the value. What's the best way to do it in JPA with annotations?

Thanks.

+1  A: 

I just want to have a method which call nextval on a sequence associated with "code" field, and returns the value. What's the best way to do it in JPA with annotations?

  • Use native SQL to get the next sequence value when the user pushes the button. Either create the sequence manually or use a "fake entity" to have JPA create it for you.
  • If you don't want to use native SQL, insert an entity relying on the sequence and gets its id.

Both solutions sounds a bit ugly. Maybe you could simply use a random generator like a UUID generator.

Actually, you didn't mention anything about the uniqueness of the code (and the JPA annotations don't show it must be unique). Why don't you return a random int?

Pascal Thivent
Code number must be unique but not always. When the button is pushed a new unique value must be given though the user can change it and insert another value (which can be even one already stored in database). It's like giving the oportunity to the user to see the next possible value and he can or not accept it (but without saving anything in database)
Javi
@Javi Then why not using a random generator?
Pascal Thivent
@Pascal Thivent maybe it could do the trick,or just even a static long attribute and increment it by one.
Javi