SpringBoot:这是保存具有ManyToOne关系的新条目的正确方法吗?

时间:2016-03-03 14:39:24

标签: spring hibernate jpa spring-boot

我有两个实体PersonVisit

PersonVisit有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;
    }

}

我想知道以下方法是否正确。还是有另一种更好的方法吗?

2 个答案:

答案 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()?

Hibernate: Difference between session.get and session.load

答案 1 :(得分:1)

是的,在我看来,这是映射bidirectional关系的标准方式。编辑:personId列指向Person实体的“id”字段.Eg:

@Id
private Long id;

更新:1:VisitModel是'DTO'或数据传输对象。任何单独的包都没问题。您可以考虑将它们放入一个单独的jar中,以便任何使用您的API(使用java)的人都可以在进行调用之前使用jar来创建数据。 2)就我所见,你保存它的方式很好。