Как сделать идентификаторы встраиваемого класса уникальными вместе с spring data jpa, чтобы нельзя было вводить дубликаты

#hibernate #spring-data-jpa #spring-data #nhibernate-mapping

#спящий режим #spring-data-jpa #spring-data #nhibernate-сопоставление

Вопрос:

У меня есть 3 таблицы User , Book и Review . Review имеет EmbeddedId, который я хочу сделать уникальным, чтобы не было дубликатов пользователя, просматривающего книгу более одного раза. Заранее спасибо.

 @Entity
public class Review {
    
   @EmbeddedId
   private ReviewCompositKey id;
   
   // ....
}


@Embeddable
public class ReviewCompositKey implements Serializable {
    
   private static final long serialVersionUID = 1L;
    
   private Long userId;
   private Long bookId;
   //  ....
}

@Override
public void run(String... args) throws Exception {
    
   User user = new User("John", "Doe", "john@example.com",
             "testpass", "testpass", "admin", true);
   user = userRepository.save(user);
      
   List<String> authors = Arrays.asList("Blake", "Jane");
   Book book = new Book("Just A Trial", "123456789abc", "1940", 
                           authors);
   book = bookRepository.save(book);
      
   Review review = new Review(new ReviewCompositeKey(user.getId(), 
                             book.getId()), (byte)4, "First Title");
   review = reviewRepository.save(review);
    
   Review review1 = new Review(new ReviewCompositeKey(user.getId(), 
   book.getId()), (byte)4, "First Title");
   review1 = reviewRepository.save(review1);
       
}
 

Комментарии:

1. Ваша @EmbeddedId аннотация уже делает обзор уникальным… вам нужна помощь с другими таблицами или вопрос был о классе Review?

2. Спасибо за ответ. Я спросил только о классе Review, потому что, когда я создавал отзыв с одним и тем же пользователем и дважды заказывал, это сработало, поэтому мне было интересно, уникальны ли они вместе.

3. Трудно сказать, не видя всего кода, но из того, на что я смотрю, вы не сможете этого сделать. Вы не инициализируете userId and bookId , так что, возможно, он использует какой-то случайный Long?

4. Я отредактировал код, возможно, это немного прояснит проблему

Ответ №1:

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