在Hibernate中映射一对多的关系?

时间:2014-02-26 17:01:05

标签: java mysql hibernate hibernate-mapping

我有两个表,一个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

我做错了什么?

2 个答案:

答案 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冲突造成的。

另见this SO answer

答案 1 :(得分:1)

当您使用List或数组时,Hibernate将维护关联的顺序。为此,它需要多边表中的整数列来存储记录在List /数组中的位置。你可以:

  1. 更改您的字段以使用Set,Hibernate将不会尝试维护订购。
  2. 向数据库添加整数类型列以存储记录顺序,并在@OrderColumn注释中命名。