【问题标题】:@OneToMany is not fetching for existing childs@OneToMany 没有为现有的孩子获取
【发布时间】:2018-10-16 01:18:01
【问题描述】:

我有代码可以使用 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 中创建一个条目,并在地址中创建一个条目,并且目标地址ID 也指向右侧Address.id。然后我再次发送相同的 JSON 并休眠创建新的 Address 与之前的相同,它没有重用它。

我希望休眠检查地址是否存在,如果存在,它不会在表Address 中创建新行,而是使用已经存在的行。这在某种程度上是可能的吗?这种行为会创建两条重复的行(只有 ID 不同),这不是我想要的。感谢您的帮助!

【问题讨论】:

    标签: java spring hibernate rest spring-boot


    【解决方案1】:

    您必须检查此地址是否已由您自己定义。没有任何 Hibernate 机制可以为您做到这一点。

    我建议您使用方法创建一个AddressService,比如说getOrCreate() 方法,该方法将检查是否存在带有传递数据的地址,或者是否应该创建它。这对您来说是某种业务规则,因此在控制器和存储库之间提供一个额外的层感觉是个好主意。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-31
      • 1970-01-01
      • 1970-01-01
      • 2018-01-29
      • 2021-08-19
      • 2013-08-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多