我有2个由外键链接表(用户和饲料)。随后,我使用Spring引导和Hibernate进行查询只打印出在饲料表中的所有值。但是,当涉及到外键和它的价值,我的实体,似乎是想错了地方创造的飞行一个新的列时,我已经为外键的列。
我可以请知道我做错了什么?这个新的JPA设置。困惑,是否我甚至应该先创建我的架构或让JPA只是根据我的实体设置处理事情。显然,我失去了一些东西这个至关重要的,但就是不能把一个手指就可以了。请协助。
问题是我如何映射到外键?由于在地图频道表的外键“OWNER_NAME”到用户表的实体上的“用户名”?
表结构
实体
用户实体
@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();
}
表格内的测试值。
用户表数据
饲料表数据
如果我跑我当前的代码,我结束了在飞行中的附加列如下如上面提到的,我不想让。
你好,这并不奇怪,您指定的名称属性添加到@JoinColumn是actualy引用的列。你需要指定的频道表,该表是“OWNER_NAME”外键列。该@JoinColumn的正确完整的定义是:
@JoinColumn(name="owner_name",referencedcolumn = "username")
private User ownerName;
当你实际上并不需要定义引用列,但让你明白什么是什么我已经定义它完成。