我正在尝试使用Java EE 6和toplink + eclipselink作为持久性提供程序,以作者作为外键和用户名作为主键,在作者和他的帖子之间建立OneToMany关系。
这就是我所拥有的:
用户类
中的注释@Id
@NotNull(message = "Please enter username")
@Size(min = 8, max = 40)
@Column(unique=true, nullable=false)
private String username;
...
private Collection<BlogEntry> blg = new ArrayList<BlogEntry>();
@OneToMany(cascade = {CascadeType.ALL}, mappedBy="user")
public Collection<BlogEntry> getBlg() {
return blg;
}
BlogEntry类中的注释
@NotNull
@Size(min = 8, max = 40)
private String author;
...
private User user;
@ManyToOne()
public User getUser() {
return user;
}
问题是在将值插入BlogEntry表时添加了一个新列(USER_USERNAME),这当然显示了BlogEntry中不存在的字段的错误:
INSERT INTO BLOGENTRY (ID, CONTENT, AUTHOR, TITLE, CREATED, USER_USERNAME) VALUES (?, ?, ?, ?, ?, ?)
bind => [301, xxxxxxxx, xxxxxxxx, xxxxxxxx, 2011-06-07 12:49:07.014, null]
我很高兴知道为什么添加这样一个列或修复什么来使用用户名和作者字段获得简单的OneToMany关系。我搜索并尝试了许多教程,但似乎我错过了一些东西。
答案 0 :(得分:2)
如果要将现有AUTHOR
列用作外键,则需要将多对一关系映射到该列,如下所示:
@ManyToOne()
@JoinColumn(name = 'author')
private User user;
请注意,在典型情况下,您可以从班级中删除单独的author
字段,因为现在可以将其作为user.getUsername()
获取。如果您需要类中的两个字段,则需要使用insertable = false, updateable = false
将其中一个标记为只读,因为只能将一个读写字段映射到特定列。