在Spring Data中为具有预定义ID的实体实现Persistable.isNew的首选方法

Art*_*sov 4 jpa spring-data spring-data-jpa

实体是Tile,它在地图上用它的坐标唯一标识:

import org.springframework.data.domain.Persistable;

@Entity
class Tile implements Persistable<Tile.Coordinates> {
   @Embeddable
   public static class Coordinates implements Serializable {
       long x;
       long y;
       public Coordinates(x,y){this.x=x; this.y=y;}
   }

   @EmbeddedId Coordinates coordinates;

   private Tile(){}
   public Tile(long x,long y) {this.coordinates=new Coordinates(x,y);}

   @Override
   public boolean isNew(){
      // what is preferred implementation? 
   }
   // other code
}
Run Code Online (Sandbox Code Playgroud)

平铺坐标是预定义的,因为没有坐标的平铺是无意义的.

Tile tile=new Tile(x,y);
Run Code Online (Sandbox Code Playgroud)

uai*_*ert 6

这取决于您的属性具有哪种ID.

首先,您需要将注释@Transient放在isNew()方法上.

如果你是一个Long(或任何其他对象),你可以检查是否id == null.如果你的id是long(或任何其他原语),你需要检查是否id == 0.

在您发布的实体中有一个嵌入式ID,并且不执行if embedded == null,因为JPA将检查属性.


Des*_*der 5

我认为没有首选方法。

我想你可以,例如,实现一个版本列并用 1 初始化,你isNew()可以return version == 1;

我确信还有其他方法可以做到这一点。