共计 2081 个字符,预计需要花费 6 分钟才能阅读完成。
当咱们应用 @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 会报错