我有2个通过外键链接的表(用户表和Feed)。之后,我使用Spring Boot和Hibernate进行查询,以仅打印出Feed表中的所有值。但是当涉及到外键及其值时,当我已经有一个外键列时,我的实体似乎正在错误地创建一个新列。
请问我在做什么错吗?此JPA设置的新功能。对于我什至应该先创建架构还是让JPA只是根据我的Entity设置处理事情感到困惑。显然,我错过了一些至关重要的事情,但是根本无法投入。请协助。
问题是如何映射到外键?如地图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;
}
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();
}
测试表中的值。
用户表数据
进给表数据
如果我运行当前的代码,则会在运行中最终出现如下所示的附加列,我不希望这样做。
答案 0 :(得分:2)
嗨,这并不奇怪,您已经将@@ IninColumn指定为实际引用的列的名称属性。您需要在Feed表中指定“ owner_name”外键列。 @JoinColumn的正确完整定义是:
@JoinColumn(name="owner_name",referencedcolumn = "username")
private User ownerName;
实际上不需要定义引用的列,但是为了完成定义,我已经定义了它,以便您了解什么。