spring - How to explictly state that an Entity is new (transient) in JPA? -
i using spring data jparepository, hibernate jpa provider.
normally when working directly hibernate, decision between entitymanager#persist() , entitymanager#save() programmer. spring data repositories, there save(). not want discuss pros , cons here. let consider following, simple base class:
@mappedsuperclass public abstract class persistableobject { @id private string id; public persistableobject(){ this.id = uuid.randomuuid().tostring(); } // hashcode() , equals() implemented based on equality of 'id' } using base class, spring data repository cannot tell entities "new" (have not been saved db yet), regular check id == null not work in case, because uuids eagerly assigned ensure correctness of equals() , hashcode(). repository seems invoke entitymanager#merge() - inefficient transient entities.
the question is: how tell jpa (or spring data) entity new, such uses entitymanager#persist() instead of #merge() if possible?
i thinking along these lines (using jpa lifecycle callbacks):
@mappedsuperclass public abstract class persistableobject { @transient private boolean isnew = true; // default, treat entity new @postload private void loaded(){ // loaded entity never new this.isnew = false; } @postpersist private void saved(){ // saved entity not new anymore this.isnew = false; } // how jpa (or spring data) use method? public boolean isnew(){ return this.isnew; } // other properties, constructor, hashcode() , equals same above }
maybe should add @version column:
@version private long version in case of new entity null
Comments
Post a Comment