2014-10-27 2 views
2

У меня есть экземпляр, где я пытаюсь отслеживать всех пользователей в категории, где пользователи могут переключаться. Например, предположим, что у меня есть простой класс Entity следующим образом.ElementCollections уникальный по id родителя, указанное значение

@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 списков. В идеале я хотел бы иметь уникальное ограничение на комбинацию основного идентификатора и пользователя. Как я могу это сделать?

Этот код не имеет уникального ограничения, когда второй пользователь отправляет флажок для изображения, потому что уникальный пользователь задает, а не комбинацию идентификатора пользователя/фотографии.

Я пытался использовать @CollectionsTable, как следует, но с ошибкой, как перечисленные

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

    @ElementCollection(fetch=FetchType.LAZY) 
     @CollectionTable (name="photo_flagged_users", [email protected](name="flaggedUsers"),uniqueConstraints = @UniqueConstraint(columnNames={"photo.id","flaggedUsers"})) 

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

В Eclipse, в @UniqueConstrants красного цвета, со следующим текстом всплывающей подсказки:

Значение атрибута аннотации CollectionTable.uniqueConstraints должно быть некоторым @ javax.persistence.UniqueConstraint аннотация

+0

Есть http://stackoverflow.com/questions/14673118/jpa-how-to-express-a-unique-constraint-including-an-elementcollection-column help? – Mark

+0

Это близко, но @CollectionTables работает не так, как ожидалось, по крайней мере, есть кое-что, что мне не хватает. – PearsonArtPhoto

ответ

1

Я предлагаю держать лет ur Photo и User сущности, чистые отношения и вводят промежуточный слой/таблицу для размещения этого. Скажем, эта новая таблица называется Photo_Users

Photo < -1..many->Photos_Users < -many..1->User

Вы также ввести уникальный ключ в качестве embedabble класса:

@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 
} 

Эта установка даст вам гибкость, в которой вы нуждаетесь.

Смежные вопросы