Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JPA: how to make a field auto increment

I use Eclipselink as my JPA provider, how can I make a field auto increment?

like image 781
Thang Pham Avatar asked Oct 13 '22 23:10

Thang Pham


2 Answers

I just want an auto-increment field for 1 entity.

Yes, I get that, this is what you wrote in your question. But it can be interpreted in several ways and repeating the same thing without clarifying doesn't help much :)

So does Pascal's way work or I have to do what Bytecode suggest, query select (max) counter + 1 from MyEntity, to get the next value, then set it to the design field, the persist?

If you want to increment a field per entity record (e.g. a "counter" for Order with id=1, another one for Order with id=2), what I suggested would work.

If you want a behavior similar to a primary key (i.e. an auto-incremented column), it won't. And in that case, standard JPA doesn't offer any particular facility (standard JPA only allows GenereatedValue on Id annotated field). The only way I can think of would be to insert another dedicated entity just to get the primary key from it.


Your exact requirement is unclear but I'm assuming you're talking about a random field, not the primary key. In that case, you could maybe use life cycle callbacks methods:

@Entity
public class MyEntity {
    ...
    private int counter;
    ...

    @PrePersist
    @PreUpdate
    protected void increment() {
         counter = counter + 1;
    }
}
like image 61
Pascal Thivent Avatar answered Oct 27 '22 17:10

Pascal Thivent


JPA 2.0 allows you to set auto_increment in a non-id field as long as you define the auto increment column in your schema - Hibernate / EclipseLink will not do it for you:

`non_id` bigint(20) DEFAULT NULL AUTO_INCREMENT,

and then in your entity:

 @Column(name = "non_id")
 @GeneratedValue
 public void setId(Long id) {
   this.id = id;
 }

will do the trick.

like image 20
Gonzalo Garcia Lasurtegui Avatar answered Oct 27 '22 17:10

Gonzalo Garcia Lasurtegui