ddl-auto update 创建的意外表
Posted
技术标签:
【中文标题】ddl-auto update 创建的意外表【英文标题】:Unexpected table created by ddl-auto update 【发布时间】:2020-01-21 06:26:00 【问题描述】:我有两个 JPA 实体通过一对多关系连接的 spring-boot 应用程序。
@Entity
@Table(name = "todos")
public class ToDo
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column
private String description;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id")
private User user;
@Column
private LocalDate targetDate;
public ToDo()
// Constructors, getters, setter, etc.
@Entity
@Table(name = "users")
public class User
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(unique = true, nullable = false)
private String username;
@Column(nullable = false)
private String password;
@OneToMany(
cascade = CascadeType.ALL,
orphanRemoval = true
)
private List<ToDo> toDos = new ArrayList<>();
// Constructors, getters, setter, etc.
对于这种关系,我希望只有两个表,但 Hibernate 创建三个。
Hibernate: create table todos (id bigserial not null, description varchar(255), target_date date, user_id int8, primary key (id))
Hibernate: create table users (id bigserial not null, password varchar(255) not null, username varchar(255) not null, primary key (id))
Hibernate: create table users_to_dos (user_id int8 not null, to_dos_id int8 not null)
最后一个看起来没用。为什么它会创建,我可以阻止它吗?可能是代码有问题?
【问题讨论】:
【参考方案1】:@OneToMany(mappedBy="speciality",fetch = FetchType.LAZY)
@JsonIgnore
private Set<DepartmentMaster> departmentSpeciality;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name="SPECALITY_ID")
@JsonIgnore
private SpecialityMaster speciality;
尝试像这样进行映射,我认为这不会产生任何问题。
【讨论】:
【参考方案2】:由于用户实体上的待办事项列表没有@JoinColumn
注释,因此休眠假设有一个额外的映射表并创建它。
在字段中添加@JoinColumn
注解不会被创建
在this guide上查看更多信息
【讨论】:
这意味着我在错误的地方有@JoinColumn 注释?它应该在列表字段中? 你想在哪里保存连接列?在users
或todos
表上?对我来说,拥有两次似乎很糟糕,所以连接列(连同字段)应该只在其中一个上。但一般来说,如果你有@OneToMany
没有@JoinColumn
,这意味着一个单独的连接表
一个用户可以连接多个待办事项。还连接了有关配置的问题,即 Hibernate 已经创建了连接字段 user_id
并使用它,但也创建了一直为空的连接表。奇怪...
它创建它是因为在用户实体上有一个带有@OneToMany
的字段,因此在另一个实体上存在反向关系这一事实并不重要。在我看来,您不需要用户实体上的 todos 字段,关系存储在Todo entity
上。如果要将其保存在两个表上,请将@JoinColumn
添加到字段
我如何理解集合方面的 mappedBy 和另一端的 @JoinColumn
是最正确的。这是真的吗?以上是关于ddl-auto update 创建的意外表的主要内容,如果未能解决你的问题,请参考以下文章
上一封 下一封 APPLE-SA-2019-3-25-2 macOS Mojave 10.14.4,Security Update 2019-002 High Sierra, Security Upd