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 注释?它应该在列表字段中? 你想在哪里保存连接列?在userstodos 表上?对我来说,拥有两次似乎很糟糕,所以连接列(连同字段)应该只在其中一个上。但一般来说,如果你有@OneToMany 没有@JoinColumn,这意味着一个单独的连接表 一个用户可以连接多个待办事项。还连接了有关配置的问题,即 Hibernate 已经创建了连接字段 user_id 并使用它,但也创建了一直为空的连接表。奇怪... 它创建它是因为在用户实体上有一个带有@OneToMany 的字段,因此在另一个实体上存在反向关系这一事实并不重要。在我看来,您不需要用户实体上的 todos 字段,关系存储在Todo entity 上。如果要将其保存在两个表上,请将@JoinColumn 添加到字段 我如何理解集合方面的 mappedBy 和另一端的 @JoinColumn 是最正确的。这是真的吗?

以上是关于ddl-auto update 创建的意外表的主要内容,如果未能解决你的问题,请参考以下文章

springdata jpa之ddl-auto配置的属性

Python MySQL Update

spring-boot Jpa配置

创建触发器以在更新表之后插入

SpringBoot入门(IDEA篇)

上一封 下一封 APPLE-SA-2019-3-25-2 macOS Mojave 10.14.4,Security Update 2019-002 High Sierra, Security Upd