2016-03-03 39 views
1

我有兩個實體PersonVisitSpringBoot:這是保存具有ManyToOne關係的新條目的正確方法嗎?

Person具有一對多與Visit關係。 我想知道是否要保存Visit的新條目,以及使用RestController的中間代碼。我的方法是否正確?還是有另一種更有效率的方式?

所以我有以下控制器,從RequestBody需要一個VisitModel,它是一個正確的方式來調用它是這樣嗎?

VisitModel具有person的ID和Visit實體所需的屬性。我使用人員的ID在personRepository中查找相關的Person條目,然後將其發佈到Visit的新實例,然後使用visitRepository進行保存。如下

@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; 
    } 

} 

我想知道下面的方法是正確的

@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"; 
} 

的訪問實體外觀。還是有另一種更好的方法?

+0

一個優化我可以看到的是,而不是使用存儲庫方法,你可以使用new運算符創建人對象並填充ID字段,並用它獲得人物對象。這將節省數據庫命中以獲取人員對象。 –

+0

@MadhusudanaReddySunnapu你的意思是如下新人(personId);'? – starcorn

+0

是的。你是否看到任何問題? –

回答

2

當然,您無需從數據庫中獲取Person以將其與Visit相關聯。因爲,您只需要idPerson將其保存在外鍵列personId中。

如果使用JPA EntityManager

Person person = entityManager.getReference(Person.class, visit.personId); 

對Hibernate Session

Person person = session.load(Person.class, visit.personId); 

這種方法只需要創建一個代理,並沒有做任何數據庫請求。

隨着休眠Session我用new Person(personId)作爲@MadhusudanaReddySunnapu建議。一切正常。

What is the difference between EntityManager.find() and EntityManger.getReference()?

Hibernate: Difference between session.get and session.load

+0

當使用'新人(personId)'時,它沒有從數據庫加載條目。然而,它使用EntityManager運行良好。通過'Session',我無法使用'@ Autowired'注入它。我如何獲得會話實例? – starcorn

+0

@starcorn如果你使用'EntityManager' - 使用'getReference()'或'new Person(personId)'(如果它有效的話)。不要使用'EntityManager'和'Session'混合使用。要回答你的問題:你可以從EntityManager' Session session = entityManager.unwrap(Session.class);' –

1

是的,這似乎是映射bidirectional關係的標準方法。編輯:personId柱指向Person entity.Eg的 「id」 字段:

@Id 
private Long id; 

UPDATE:1:VisitModel是一個 'DTO' 或數據傳輸對象。任何單獨的軟件包都可以。你可以考慮把它們放到一個單獨的jar中,這樣任何使用你的API的人(用java)都可以在發出調用之前使用jar創建數據。 2)就我所能看到的那樣,你保存它的方式很好。

+0

然後在什麼包你會把'VisitModel'。現在我有包含在域包中的實體和存儲庫類。但VisitModel不適合那裏。 – starcorn

+0

因此,爲了保存訪問條目,您也可以像我那樣做嗎?先用'personId'查找Person,然後將其發佈到Visit的新實例? – starcorn

+0

謝謝。不知道DTO是它的概念名稱:) – starcorn

相關問題