当咱们应用@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中申明的表,并且无论在哪一端进行保护都能够失常执行。
可能遇到的谬误:
- Hibernate: alter table task_form_item add constraint FK74s28wmeq8dcs2ms0mnxkmueb foreign key (form_item_id) references form_item (id)
呈现这个报错的起因可能是因为对数据表操作不当,造成数据不残缺,咱们只须要把现存的task_form_item数据表删除后再运行即可。
2.
翻译之后发现提醒咱们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会报错