Спящий режим: уникальное ограничение для списка вложенных объектов (@ElementCollection)

Times спросил: 13 июня 2018 в 10:57 в: java

С учетом Enitiy Product

@Entity
public class Product {    private Long id;
    private List<Review> reviews;    public Product() {}    @Id
    @GeneratedValue
    public Long getId() {
        return this.id;
    }    public void setId(Long id) {
        this.id = id;
    }    @ElementCollection
    public List<Review> getReviews() {
        return reviews;
    }    public void setReviews(List<Review> reviews) {
        this.reviews = reviews;
    }    // equals() and hashCode() omitted for brevity
}

И встраиваемого

@Embeddable
public class Review {    private Customer author;
    private String title;
    private String comment;    public Review() {}    @ManyToOne(optional = false)
    @Column(unique = true)
    public Customer getAuthor() {
        return author;
    }    public void setAuthor(Customer author) {
        this.author = author;
    }    @Column(nullable = false)
    public String getTitle() {
        return title;
    }    public void setTitle(String title) {
        this.title = title;
    }    @Column(nullable = false, length = 2000)
    public String getComment() {
        return comment;
    }    public void setComment(String comment) {
        this.comment = comment;
    }
}

Как установить уникальное ограничение для автора Review. Другими словами: я хочу убедиться, что для данного продукта каждый отзыв имеет другого автора.

Могу ли я использовать Review? Использовать ли @NaturalId? Я уже нашел аналогичный вопрос в StackOverflow , но в моем случае это список Embeddables, а не только член, так что этот подход не будет работать, я думаю.

Большое спасибо!

1 ответ

Alan Hay ответил: 14 июня 2018 в 08:09

Если вы говорите о наличии уникального индекса базы данных, добавленного при генерации схемы, вы можете сделать это, как показано ниже:

@ElementCollection
@CollectionTable(name = "product_reviews", 
       uniqueConstraints = {@UnqiqueConstraint(columnNames={"product_id", "author_id"})})
public List<Review> getReviews() {
    return reviews;
}

Дополнительное видео по вопросу: Спящий режим: уникальное ограничение для списка вложенных объектов (@ElementCollection)

Hibernate Tip: How to persist a List of Strings as an ElementCollection

Hibernate Tutorial 10 - Saving Collections

How to persist Java Collections by @ElementCollection annotation in Hibernate using JPA ?