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

时间:2014-10-11 09:15:31

标签: 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
}

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

Tile tile=new Tile(x,y);

2 个答案:

答案 0 :(得分:5)

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

首先,您需要在@Transient方法上添加注释isNew()

如果您的ID是Long(或任何其他对象),您可以查看是否id == null。如果您的ID是long(或任何其他原语),则需要检查id == 0

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

答案 1 :(得分:3)

我认为没有一种首选方式。

我想您可以,例如,实现版本列并使用1进行初始化,isNew()可以return version == 1;

我确定还有其他方法可以做到。