实体映射是动态创建不必要的列

问题描述 投票:2回答:1

我有2个由外键链接表(用户和饲料)。随后,我使用Spring引导和Hibernate进行查询只打印出在饲料表中的所有值。但是,当涉及到外键和它的价值,我的实体,似乎是想错了地方创造的飞行一个新的列时,我已经为外键的列。

我可以请知道我做错了什么?这个新的JPA设置。困惑,是否我甚至应该先创建我的架构或让JPA只是根据我的实体设置处理事情。显然,我失去了一些东西这个至关重要的,但就是不能把一个手指就可以了。请协助。

问题是我如何映射到外键?由于在地图频道表的外键“OWNER_NAME”到用户表的实体上的“用户名”?

表结构

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

饲料实体

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

表格内的测试值。

用户表数据

enter image description here

饲料表数据

enter image description here

如果我跑我当前的代码,我结束了在飞行中的附加列如下如上面提到的,我不想让。

enter image description here

java mysql hibernate spring-boot jpa
1个回答
2
投票

你好,这并不奇怪,您指定的名称属性添加到@JoinColumn是actualy引用的列。你需要指定的频道表,该表是“OWNER_NAME”外键列。该@JoinColumn的正确完整的定义是:

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

当你实际上并不需要定义引用列,但让你明白什么是什么我已经定义它完成。

© www.soinside.com 2019 - 2024. All rights reserved.