我有使用Hibernate来实现@ManyToOne
关系的代码。我有两个课程Package
和Address
。在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不同),这不是我想要的。谢谢你的帮助!
答案 0 :(得分:1)
您必须检查此地址是否已由您自己定义。没有可以为你做的Hibernate机制。
我建议您使用方法创建AddressService
,然后使用getOrCreate()
方法检查是否存在已传递数据的地址,或者是否应创建该地址。这对你来说是一种商业规则,所以在控制器和存储库之间提供一个额外的层感觉就像一个好主意。