@OneToMany未获取现有子项

时间:2018-05-05 20:32:34

标签: java spring hibernate rest spring-boot

我有使用Hibernate来实现@ManyToOne关系的代码。我有两个课程PackageAddress。在Address我希望有一个唯一的条目,其中每个地址都与其他地址有所不同。然后我有Package正在使用它。

@Entity
public class Address {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Column(name = "id", nullable = false, updatable = false)
  private Long id;

  String street_with_number;
  String city;
  String region;
  //...
}

@Entity 
public class Package {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Column(name = "id", nullable = false, updatable = false)
  private Long id;

  String eshopId;

  @ManyToOne(fetch = FetchType.LAZY)
  @JoinColumn(name="destination_address_id")
  private Address destination_address;

  //...
}

然后我有JpaRepository来创建repo:

@RepositoryRestResource
public interface PackageRepository extends JpaRepository<Package, Long> {
   //...
  }

之后我使用它在REST控制器中注入

@RestController
@RequestMapping("/api/")
public class RestController {
  private PackageRepository packageRepository;

  @Inject
  public void setRepository(PackageRepository packageRepository) {
    this.packageRepository = packageRepository;
  }

  @RequestMapping(method = RequestMethod.POST)
  public ResponseEntity<?> addPack(@RequestBody Package pack) {
    return new ResponseEntity<>(packageRepository.save(pack), HttpStatus.CREATED);
  }
}

然后使用HTTP REST我像这样发送json

{
   "eshopId" : 1,
   "destination_address": {
       "street_with_number": "string",
       "city": "string",
       "region": "string"
   }
} 

在表Package中创建一个条目,在地址中创建一个条目,然后确定destination_address_id指向右Address.id。然后我再次发送相同的JSON,并且hibernate创建与之前相同的新Address,它不会重复使用它。

我希望hibernate检查地址是否存在,如果是,它不会在表Address中创建新行,而是使用已存在的那一行。这有点简单吗?此行为会创建两个重复的行(只有ID不同),这不是我想要的。谢谢你的帮助!

1 个答案:

答案 0 :(得分:1)

您必须检查此地址是否已由您自己定义。没有可以为你做的Hibernate机制。

我建议您使用方法创建AddressService,然后使用getOrCreate()方法检查是否存在已传递数据的地址,或者是否应创建该地址。这对你来说是一种商业规则,所以在控制器和存储库之间提供一个额外的层感觉就像一个好主意。