我有一个实例,我试图跟踪用户可以切换的类别中的所有用户。例如,让我们假设我有一个简单的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注释
答案 0 :(得分:1)
我建议让您的Photo
和User
实体保持清晰的关系,并引入一个中间层/表来适应这种情况。假设这个新表名为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
}
此设置将为您提供所需的灵活性。