实体映射正在动态创建不需要的列

时间:2019-02-09 19:55:08

标签: java mysql hibernate spring-boot jpa

我有2个通过外键链接的表(用户表和Feed)。之后,我使用Spring Boot和Hibernate进行查询,以仅打印出Feed表中的所有值。但是当涉及到外键及其值时,当我已经有一个外键列时,我的实体似乎正在错误地创建一个新列。

请问我在做什么错吗?此JPA设置的新功能。对于我什至应该先创建架构还是让JPA只是根据我的Entity设置处理事情感到困惑。显然,我错过了一些至关重要的事情,但是根本无法投入。请协助。

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

表结构

enter image description here

实体

用户实体

@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;
}

Feed实体

@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;
}

我的查询只获取所有Feed数据,而我得到的所有数据减去外键值(为空)。 (期望获取外键值)。

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

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

测试表中的值。

用户表数据

enter image description here

进给表数据

enter image description here

如果我运行当前的代码,则会在运行中最终出现如下所示的附加列,我不希望这样做。

enter image description here

1 个答案:

答案 0 :(得分:2)

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

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

实际上不需要定义引用的列,但是为了完成定义,我已经定义了它,以便您了解什么。