0

次のコードがあります。

public int makePayment(User forUser, Collection<Movie> cartItems, 
     Address deliverTo) 
{
   int returnCode = 0;

   LOGGER.debug("Number of items in cart - {}", cartItems.size());

   Rental rental = new Rental();
   rental.setRentalID(RandomStringUtils.randomAlphanumeric(ID_LENGTH).toUpperCase());
   rental.setUser(forUser); // Update reference to parent
   rental.setAddress(deliverTo);

   // Each rental has its own set of rented movies
   Set<RentedMovie> rentedMovies = new HashSet<>(cartItems.size());
   for (Iterator<Movie> iterator = cartItems.iterator(); iterator.hasNext();)
   {
      Movie movie = iterator.next();
      RentedMovie rentedMovie = new RentedMovie();
      rentedMovie.setMovie(movie);
      rentedMovie.setRental(rental); // Update reference to parent
      rentedMovies.add(rentedMovie);
   }

   rental.setRentedMovies(rentedMovies);
   rentalDAO.create(rental);

   Set<Rental> userRentals = userDAO.findById(forUser.getUserID()).getRentals();
   userRentals.add(rental); // Add to existing set of rentals

   try
   {
      String addressID = addressDAO.create(deliverTo);
      LOGGER.debug("Delivery Address successfully inserted. Generated address ID - {}", addressID);

      forUser.setRentals(userRentals);
      userDAO.update(forUser); // Internally calls session.merge()
   }
   catch (Exception e) {
      returnCode = -1;
      LOGGER.error("Exception during payment - {}", e.getMessage(), e);
   }

   return returnCode;
}

上記のメソッドが完了すると、hibernate は以下に説明するように特定の冗長な更新クエリを実行します。

カートに2つのアイテムを追加するとしましょう...

DEBUG PaymentService - Number of items in cart - 2

次に、RENTALSテーブルに行が挿入されます (予想)

insert 
into
  rentals
  (bookingDate, userID, addressID, rentalID) 
values
  (?, ?, ?, ?)

USERADDRESS1行が挿入されてから1回更新されたテーブル(RENTALS冗長)

update
  users 
set
  userName=?,
  password=?,
  firstName=?,
  lastName=?,
  email=?,
  addressID=? 
where
  userID=?

update
  addresses 
set
  line1=?,
  line2=?,
  city=?,
  state=?,
  pincode=? 
where
  addressID=?

MOVIESテーブルはカート内のアイテム数と同じ回数更新されます (この場合は 2 で、これも冗長です)。

update
  movies 
set
  movieName=?,
  releaseYear=?,
  rating=?,
  nCopies=?,
  imageUri=?,
  plotLine=? 
where
  movieID=?

/* And another query with different movieID */

テーブルに 2 つのレコードが挿入されましたRENTED_MOVIE(予想)

insert 
into
  rented_movie
  (rentalID, returnDate, movieID) 
values
  (?, ?, ?)

/* And one more with same rentalID and diff. movieID */

最後に、テーブルへの選択クエリ(なぜ??)RENTALS

上記の冗長なクエリの理由は何ですか?

MySQL 5.5 で Hibernate 4.2.1 を使用しています


スキーマ図へのリンク

User.hbm.xmlへのリンク

Rental.hbm.xmlへのリンク


更新:どのような組み合わせinverseを試しても、これらのn + 2の更新を回避できないようです(n =カート内の映画の数):(

これが既知の動作であるかどうかを教えてください。はいの場合、可能な回避策は何ですか?

4

1 に答える 1