首页 > 解决方案 > 实体映射正在动态创建不需要的列

问题描述

我有 2 个表(用户和提要)由外键链接。之后,我使用 Spring Boot 和 Hibernate 进行查询以打印出 Feed 表中的所有值。但是当涉及到外键及其值时,我的实体似乎出错了,当我已经有一个外键列时,它会动态创建一个新列。

我能知道我做错了什么吗?此 JPA 设置的新手。对我是否应该首先创建我的模式或让 JPA 根据我的实体设置来处理事情感到困惑。显然,我错过了一些重要的东西,但就是不能指望它。请协助。

问题是如何映射到外键?就像在实体上将 Feed 表的外键“所有者名称”映射到用户表的“用户名”一样?

表结构

在此处输入图像描述

实体

用户实体

@Entity
public class User {
    @Id
    @Column(name = "username")
    public String username;

    @Column(name = "email")
    public String email;

    @Column(name = "password")
    public String password;

    @Basic
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "created_at")
    private Date createdAt;

    @Column(name = "online_status")
    private long onlineStatus;

    @Column(name = "account_status")
    private long accountStatus;

    //updated this based on Gopi's suggestion
    @OneToMany(mappedBy = "ownerName")
    private List<Feed> feeds;
}

饲料实体

@Entity
public class Feed {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "feed_id")
    private long feedId;

    @Column(name = "title")
    private String title;

    @Basic
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "created_at")
    private Date createdAt;

    @Basic
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "updated_at")
    private Date updatedAt;

    @ManyToOne
    @JoinColumn(name = "username")
//    @Column(name = "owner_name")
    private User ownerName;
}

我的查询只是获取所有提要数据,其中我得到的所有数据减去外键的值,外键值显示为空。(期望获得外键值)。

我的控制器正在调用这个方法,我得到的所有结果都减去外键值。

public interface FeedRepository extends JpaRepository<Feed, Long> {
    @Query("select f from Feed as f order by f.createdAt desc")
    List<Feed> getCurrentFeeds();
}

测试表内的值。

用户表数据

在此处输入图像描述

Feed 表数据

在此处输入图像描述

如果我运行我当前的代码,我最终会得到一个额外的列,如下所示,我不希望如上所述。

在此处输入图像描述

标签: javamysqlhibernatespring-bootjpa

解决方案


嗨,这并不奇怪,您已将实际引用的列指定为 @JoinColumn 的名称属性。您需要在 Feed 表中指定外键列,即“所有者名称”。@JoinColumn 的正确完整定义是:

@JoinColumn(name="owner_name",referencedcolumn = "username")
    private User ownerName;

您实际上不需要定义referencedcolumn,但我已将其定义为完成,以便您了解什么是什么。


推荐阅读