我有两个实体Person
和Visit
Person
与Visit
有OneToMany关系。
我想知道我是否要保存一个新的Visit条目,以及使用RestController的interm。我的方法是否正确?或者还有另一种更有效的方法吗?
所以我有以下控制器从RequestBody获取VisitModel
,它是否正确地调用它?
VisitModel具有人员ID,以及访问实体所需的属性。我使用person的人员在personRepository中查找相关的Person条目,然后将其发布到一个新的Visit实例,然后使用visitRepository保存它。
@RequestMapping(value="", method=RequestMethod.POST)
public String checkIn(@RequestBody VisitModel visit) {
Person person = personRepository.findById(visit.personId);
Visit newVisit = new Visit(visit.getCheckIn, person);
visitRepository.save(newVisit);
return "success";
}
访问实体如下所示
@Entity
public class Visit {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
@JsonProperty("check_in")
private Date checkIn;
@JsonProperty("check_out")
private Date checkOut;
@ManyToOne
@JoinColumn(name="personId")
private Person person;
public Visit(Date checkIn, Person person) {
this.checkIn = checkIn;
this.person = person;
}
public Date getCheckIn() {
return checkIn;
}
public void setCheckIn(Date checkIn) {
this.checkIn = checkIn;
}
public Date getCheckOut() {
return checkOut;
}
public void setCheckOut(Date checkOut) {
this.checkOut = checkOut;
}
public Person getPerson() {
return person;
}
}
我想知道以下方法是否正确。还是有另一种更好的方法吗?
答案 0 :(得分:2)
当然,您不需要从数据库中获取Person
以将其与Visit
相关联。因此,您只需id
Person
personId
将其保存在外键列EntityManager
中。
如果您使用JPA Person person = entityManager.getReference(Person.class, visit.personId);
Session
for Hibernate Person person = session.load(Person.class, visit.personId);
Session
这种方法只是创建一个代理,不做任何数据库请求。
使用Hibernate new Person(personId)
我使用{{1}}作为@MadhusudanaReddySunnapu建议。一切都很好。
What is the difference between EntityManager.find() and EntityManger.getReference()?
答案 1 :(得分:1)
是的,在我看来,这是映射bidirectional
关系的标准方式。编辑:personId
列指向Person
实体的“id”字段.Eg:
@Id
private Long id;
更新:1:VisitModel是'DTO'或数据传输对象。任何单独的包都没问题。您可以考虑将它们放入一个单独的jar中,以便任何使用您的API(使用java)的人都可以在进行调用之前使用jar来创建数据。 2)就我所见,你保存它的方式很好。