總結一下最近遇到的問題

李明發表於2022-05-24

當我們使用@ManyToMany註解時執行後臺,資料庫中會自動生成關聯表,比如我們有以下兩個實體,他們之間的關係是ManyToMany

public class Task{
  . . .
  @ApiModelProperty("任務表單")
  @ManyToMany()
  private List<FormItem> formItems = new ArrayList<>();
}

public class FormItem{
  . . .
  @ApiModelProperty("任務表單")
  @ManyToMany()
  private List<Task> tasks = new ArrayList<>();
}

這樣的話會生成兩個中間表即form_item_tasks和task_form-items,並且預設情況下如果你在task端維護formItems的話資料只會自動存到task_form_items表中,反過來在formItem中維護task也會像上面一樣——存到form_item_tasks中。即前面的那一項為“主項”。
如果我們想只生成一個表那麼需要進行以下操作:

public class Task{
  . . .
  @ApiModelProperty("任務表單")
  @ManyToMany()
  @JoinTable(name = Task.TABLE_NAME + "_" + FormItem.TABLE_NAME,
          joinColumns = @JoinColumn(name = FormItem.TABLE_NAME + "_id"),
          inverseJoinColumns = @JoinColumn(name = Task.TABLE_NAME + "_id")
  )
  private List<FormItem> formItems = new ArrayList<>();
}

public class FormItem{
  . . .
  @ApiModelProperty("任務表單")
  @ManyToMany()
  @JoinTable(name = Task.TABLE_NAME + "_" + FormItem.TABLE_NAME,
          joinColumns = @JoinColumn(name = Task.TABLE_NAME + "_id"),
          inverseJoinColumns = @JoinColumn(name = FormItem.TABLE_NAME + "_id")
  )
  private List<Task> tasks = new ArrayList<>();
}

這樣的話只會生成你在@JoinTable中name中宣告的表,並且無論在哪一端進行維護都可以正常執行。

可能遇到的錯誤:

  1. Hibernate: alter table task_form_item add constraint FK74s28wmeq8dcs2ms0mnxkmueb foreign key (form_item_id) references form_item (id)
    圖片.png
    出現這個報錯的原因可能是由於對資料表操作不當,造成資料不完整,我們只需要把現存的task_form_item資料表刪除後再執行即可。

2.圖片.png
翻譯之後發現提示我們repeated column for ... form_item_id,即我們重複使用了這個欄位,再次回到程式碼中會發現我們joinColumns和inverseJoinColumns被賦予了同一個欄位。

  @ManyToMany()
  @JoinTable(name = Task.TABLE_NAME + "_" + FormItem.TABLE_NAME,
          joinColumns = @JoinColumn(name = FormItem.TABLE_NAME + "_id"),
          inverseJoinColumns = @JoinColumn(name = TABLE_NAME + "_id")
  )
  @ApiModelProperty("所屬任務")
  private List<Task> tasks = new ArrayList<>();

並且值得一提的是joinColumns和inverseJoinColumns的賦值與本實體無關係,即他們兩個交換之後並不會造成其他影響。


另外最近在執行後臺時突然出現了資料庫報錯,檢視資料庫後發現又一次出現了下面的這個報錯:

1045 - access denied for user 'root'@'localhost' (using password: yes)

由於我之前就遇到過這個問題並且還寫過一個相關文章,按照之前的方法操作之後發現中途又出現了很多其他的錯誤解決完一項又出一項新的錯誤,最後終於修改完密碼,用mysql -u root -p可以正常登陸,並且資料庫中測試顯示連線成功,但是點選資料庫還是報上面的錯誤。最後只能嘗試重灌mysql,由於網上重灌教程良莠不齊,下面分享一個親測可用的教程:ubuntu 20.04 徹底刪除mysql,並重灌mysql
綜上,mysql報錯的原因有很多,可能網上的方法可以解決大多數這種報錯,但是總會有意外,如果按照標準方法沒成功的話,那麼最快捷的方法還是解除安裝重灌。

猜測原因:密碼過期策略為預設,密碼到期所以登陸mysql會報錯

圖片.png

相關文章