ElementCollections在父级id,指定值上唯一

时间:2014-10-27 22:52:46

标签: java spring hibernate jpa

我有一个实例,我试图跟踪用户可以切换的类别中的所有用户。例如,让我们假设我有一个简单的Entity类,如下所示。

@Entity
public class Photo {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    @ElementCollection(fetch=FetchType.LAZY)
    List<User> flaggedUsers;
    //Contains getters and setters
}

单个用户可能会标记2张照片,因此成为2个列表的一部分。理想情况下,我希望对主ID和用户的组合有唯一约束。我怎么能做到这一点?

当第二个用户去标记图像时,此代码未通过唯一约束,因为唯一设置在用户上,而不是用户/照片ID的组合。

我尝试使用@CollectionsTable,如下所示,但是列出了错误

@Entity
public class Photo {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    @ElementCollection(fetch=FetchType.LAZY)
        @CollectionTable (name="photo_flagged_users", joinColumns=@JoinColumn(name="flaggedUsers"),uniqueConstraints = @UniqueConstraint(columnNames={"photo.id","flaggedUsers"}))

    List<User> flaggedUsers;
    //Contains getters and setters
}

在Eclipse中,@ UniqueConstrants是红色的,带有以下工具提示文本:

  

注释属性CollectionTable.uniqueConstraints的值必须是@javax.persistence.UniqueConstraint注释

1 个答案:

答案 0 :(得分:1)

我建议让您的PhotoUser实体保持清晰的关系,并引入一个中间层/表来适应这种情况。假设这个新表名为Photo_Users

Photo&lt; -1..many-&gt; Photos_Users&lt; -many..1-&gt; User

您还会将唯一键作为嵌入式类引入:

@Embeddable
public class PhotosUsersEntityKey implements Serializable {

    @Column(name="PROPERTY_ID", nullable=false)
    private Integer    userId;

    @Column(name="BILL_ID", nullable=false)
    private Integer    photoId;

//getters+setters
}

和PhotoUsersEntity:

@Entity
@Table(name="Photos_Users")
public class PhotosUsersEntity implements Serializable {

@EmbeddedId
private PhotosUsersEntityKey compositePrimaryKey;

//rest
}

此设置将为您提供所需的灵活性。