我有两个表,一个user
表和一个user_avatar
表。对于每个用户,user_avatar
表中有3条记录,包括3种大小的头像(大,中,小)。
user_avatar
表格有一个userId
列,引用User.id
字段来指定虚拟角色所属的用户。
这是我的UserAvatar
课程:
@Entity @Table(name = "user_avatar")
public class UserAvatar
{
@Id @GeneratedValue
private long id;
@ManyToOne
@JoinColumn(name = "userId")
private User user;
@Enumerated(EnumType.STRING)
private AvatarSize size;
private String file;
private String s3Key;
@Override
public String toString()
{
return size + " " + file;
}
}
这就是我在`user
中引用它的方式@Entity
public class User
{
@Id @GeneratedValue
public Long id;
@OneToMany
@JoinColumn(name = "id")
@OrderColumn(name = "id")
public UserAvatar[] avatar; //declared array as there'd be at least 3 records
}
当我运行此代码时,我收到错误:
Repeated column in mapping for collection: com.xxx.User.avatar column: id
我做错了什么?
答案 0 :(得分:4)
你在这里做的是一个bidrectional many-to-one
,你想在这里填充关系两边的对象。
如果双方都有JoinColumn
,Hibernate会抱怨,所以只需将其置于“拥有”一侧并将mappedBy
添加到另一方。
见这个例子:
public class UserAvatar {
...
@ManyToOne
@JoinColumn(name="userId") // userId is the name of your database FK column
private User user;
...
}
public class User {
...
@OneToMany(mappedBy="user")
public List<UserAvatar> avatars;
...
}
至于您遇到的特定错误,我认为这是由JoinColumn("id")
User
与主键列id
冲突造成的。
答案 1 :(得分:1)
当您使用List
或数组时,Hibernate将维护关联的顺序。为此,它需要多边表中的整数列来存储记录在List
/数组中的位置。你可以:
Set
,Hibernate将不会尝试维护订购。@OrderColumn
注释中命名。