2017-05-28 96 views
0

我在Thymeleaf & Springboot中有一個項目。Springboot數據架構設置

我需要知道在三個實體之間設置模式的最佳方式。

事件

項目

任務

的關係

事件到項目是多對一

項目,以事件爲一對多

項目到任務是一對多

任務以項目是多對一

實體

public Event() {} 
@Id 
private Long id 
@ManyToOne(cascade = CascadeType.ALL) 
private Project project; 

public Project() {} 
@Id 
private Long id; 
@OneToMany(mappedBy = "project", cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
private List<Task> tasks; 
@OneToMany(mappedBy = "project") 
private List<Event> event; 

public Task() {} 
@Id 
private Long id; 
@ManyToOne 
private Project project; 

由於它矗立在那一刻:

  1. 事件可以在事件UI創建並保存正確。
  2. 該項目的UI屏幕(其中包含事件的一些信息)可以創建一個項目,並在相同的用戶界面創建任務,但在點擊提交的所有信息進入數據庫,但任務表得到的任務,但FK PROJECT_ID是空的。

在獲取和發佈項目的控制器上,我將Event傳入模型中,因爲我需要計劃屏幕上Event的一些信息。

有沒有更好的方式來顯示計劃用戶界面的一些信息,但事件但CRUD計劃。 爲什麼FK project_id是空的?

UPDATE

我曾嘗試:

public Task() {} 
@Id 
private Long id; 
@ManyToOne(optional = false) 
@JoinColumn(name = "project_id") 
private Project project; 

仍然無法獲得任務表PROJECT_ID。

+0

關於這個問題的UI部分:你如何設計您的用戶界面是您的業務,它應該儘可能獨立於您的後端架構對用戶有所幫助。您正在爲用戶構建用戶界面*,而不是爲您的服務器構建自己的鞋子。但你提交頁面上的所有信息似乎很奇怪。通常情況下,REST與Ajax調用並行 – GabiM

回答

0

爲什麼FK project_id是空的?

您錯過了將多對一關係映射到FK所在列的註釋。另外,如果你想堅持的任務實例,讓你的JPA框架自動持續的項目,你應該定義一個級聯策略。

@JoinColumn(name="project_id") 
@ManyToOne(cascade=ALL) 
private Project project; 

看看一些JPA文檔,這裏是一個不錯的免費書籍:

about many-to-one

about cascading on relationships

Javadoc

+0

我在ManyToOne for private Project項目上嘗試了@JoinColumn(name =「project_id)。仍然沒有保存任務中的project_id。 –

+0

我認爲項目必須先保存,所以當它出現時爲了保存任務,任務知道要關聯哪個項目 –

+0

您應該不必費心手動保存對象並按照正確的順序。如果您的映射是正確的,那麼可以通過JPA框架自動完成,並且如果你有一個正確的級聯策略,無論如何,根據我的經驗,通過猜測它是如何工作和排除錯誤代碼的方法,你將失去更多的時間,如果你快速閱讀一些文檔,然後從第一次嘗試中獲得正確的結果 – GabiM