JPA加载子列表的子项

时间:2017-12-01 10:29:25

标签: hibernate jpa spring-boot spring-data-jpa

使用spring boot和hibernate,假设我有UserEntity个子TrailEntity列表:

@Entity
@Table(name = "USER")
public class UserEntity {
  @OneToMany(cascade=CascadeType.ALL)
  @LazyCollection(LazyCollectionOption.FALSE)
  @JoinColumn(name="userID")
  private List<TrailEntity> trails = new ArrayList<>();
}

当我添加新的TrailEntity并保存时,它工作正常,UserEntity.trails包含新的TrailEntity个对象。

userEntity.getTrails().add(trailEntity);
userService.save(userEntity);

但是,孩子的另一个列表会被保存但不会被加载:

@Entity
@Table(name = "TRAIL")
public class TrailEntity {
  @OneToMany(cascade=CascadeType.ALL)
  @LazyCollection(LazyCollectionOption.FALSE)
  @JoinColumn(name="TrailID")
  private List<ImageEntity> images = new ArrayList<>();
}

当我这样做时:

userEntity.getTrails(0).getImages().add(imageEntity);
userService.save(userEntity);
userEntity = userService.findByUsername(USERNAME);

userEntity.getTrails(0).getImages().size()为0。

即。保存链接到ImageEntity的{​​{1}}个对象,但是有没有办法在JPA(hibernate)中一直加载到层次结构中?

1 个答案:

答案 0 :(得分:0)

原来它归结为ImageEntity中的另一个实体:

@Entity
@Table(name = "IMAGE")
public class ImageEntity {
  @ManyToOne(fetch = FetchType.EAGER)
  @JoinColumn(name="BeaconID", nullable=false)
  private BeaconEntity beaconEntity;
}

但它从未使用过,导致由于ImageEntity而无法从数据库加载关联的nullable=false对象。

nullable=false删除ImageEntity.beaconEntity(默认为true)解决了问题