Рубрики
Без рубрики

Пример каскадного перехода в спящий режим (сохранение, обновление, удаление и удаление -сирота)

– Гибернация – Каскадный пример (сохранение, обновление, удаление и удаление -сирота)

Каскад – это удобная функция для сохранения строк кода, необходимых для ручного управления состоянием другой стороны.

Ключевое слово “Каскад” часто появляется в сопоставлении коллекций для автоматического управления состоянием коллекции. В этом учебном пособии этот пример один ко многим будет использоваться для демонстрации каскадного эффекта.

Пример каскадного сохранения/обновления

В этом примере, если “Запас” сохранен, все его ссылки на “Записи о запасах” также должны быть сохранены в базе данных.

1. Нет каскада сохранения-обновления

В предыдущем разделе , если вы хотите сохранить “Запас” и его ссылку “Stockdailyrecord” в базе данных, вам необходимо сохранить оба по отдельности.

Stock stock = new Stock();
StockDailyRecord stockDailyRecords = new StockDailyRecord();
//set the stock and stockDailyRecords  data

stockDailyRecords.setStock(stock);        
stock.getStockDailyRecords().add(stockDailyRecords);

session.save(stock);
session.save(stockDailyRecords);

Выход

Hibernate: 
    insert into mkyong.stock (STOCK_CODE, STOCK_NAME) 
    values (?, ?)

Hibernate: 
    insert into mkyong.stock_daily_record
    (STOCK_ID, PRICE_OPEN, PRICE_CLOSE, PRICE_CHANGE, VOLUME, DATE) 
    values (?, ?, ?, ?, ?, ?)

2. С каскадом сохранения-обновления

каскад=”сохранить-обновить” объявлен в “Stockdailyrecords”, чтобы включить каскадный эффект сохранения-обновления.



      
            
      
      

Stock stock = new Stock();
StockDailyRecord stockDailyRecords = new StockDailyRecord();
//set the stock and stockDailyRecords  data

stockDailyRecords.setStock(stock);        
stock.getStockDailyRecords().add(stockDailyRecords);

session.save(stock);

Выход

Hibernate: 
    insert into mkyong.stock (STOCK_CODE, STOCK_NAME) 
    values (?, ?)

Hibernate: 
    insert into mkyong.stock_daily_record
    (STOCK_ID, PRICE_OPEN, PRICE_CLOSE, PRICE_CHANGE, VOLUME, DATE) 
    values (?, ?, ?, ?, ?, ?)

Код session.save(stockdailyrecords); больше не требуется, когда вы сохраняете “Запасы”, он “каскадирует” операцию сохранения в указанные “Записи запасов” и автоматически сохраняет их в базе данных.

Пример каскадного удаления

В этом примере, если “Запас” удален, все его ссылки на “Записи о запасах” также должны быть удалены из базы данных.

1. Каскад удаления отсутствует

Вам нужно зациклить все “Биржевые записи” и удалить их одну за другой.

Query q = session.createQuery("from Stock where stockCode = :stockCode ");
q.setParameter("stockCode", "4715");
Stock stock = (Stock)q.list().get(0);
    
for (StockDailyRecord sdr : stock.getStockDailyRecords()){
         session.delete(sdr);
}
 session.delete(stock);

Выход

Hibernate: 
    delete from mkyong.stock_daily_record 
    where DAILY_RECORD_ID=?

Hibernate: 
    delete from mkyong.stock 
    where STOCK_ID=?

2. С помощью каскада удаления

каскад=”удалить” объявлен в “Stockdailyrecords”, чтобы включить эффект каскадного удаления. Когда вы удаляете “Запасы”, все его ссылки “Записи о запасах” будут удалены автоматически.



      
            
      
      

Query q = session.createQuery("from Stock where stockCode = :stockCode ");
q.setParameter("stockCode", "4715");
Stock stock = (Stock)q.list().get(0);
session.delete(stock);

Выход

Hibernate: 
    delete from mkyong.stock_daily_record 
    where DAILY_RECORD_ID=?

Hibernate: 
    delete from mkyong.stock 
    where STOCK_ID=?

Каскадное удаление-пример сироты

В приведенной выше опции каскадного удаления, если вы удалите запас, все его ссылки на “Записи о запасах” также будут удалены из базы данных. Как насчет того, если вы просто хотите удалить две ссылки на записи “Stockdailyrecords”? Это называется сиротским удалением, см. Пример…

1. Нет каскада удаления-сироты

Вам нужно удалить “Записи о запасах” одну за другой.

StockDailyRecord sdr1 = (StockDailyRecord)session.get(StockDailyRecord.class, 
                                            new Integer(56));
StockDailyRecord sdr2 = (StockDailyRecord)session.get(StockDailyRecord.class, 
                                            new Integer(57));

session.delete(sdr1);
session.delete(sdr2);

Выход

Hibernate: 
    delete from mkyong.stock_daily_record 
    where DAILY_RECORD_ID=?
Hibernate: 
    delete from mkyong.stock_daily_record 
    where DAILY_RECORD_ID=?

2. С каскадом удаления-сироты

каскад=”удалить-сирота” объявлен в “Stockdailyrecords”, чтобы включить эффект каскада удаления сирот. Когда вы сохраняете или обновляете запас, он удалит те “Записи о запасах”, которые уже помечены как удаленные.



      
            
      
      

StockDailyRecord sdr1 = (StockDailyRecord)session.get(StockDailyRecord.class, 
                                       new Integer(56));
StockDailyRecord sdr2 = (StockDailyRecord)session.get(StockDailyRecord.class, 
                                       new Integer(57));

Stock stock = (Stock)session.get(Stock.class, new Integer(2));
stock.getStockDailyRecords().remove(sdr1);
stock.getStockDailyRecords().remove(sdr2);
		
session.saveOrUpdate(stock);

Выход

Hibernate: 
    delete from mkyong.stock_daily_record 
    where DAILY_RECORD_ID=?
Hibernate: 
    delete from mkyong.stock_daily_record 
    where DAILY_RECORD_ID=?

Короче говоря, удалить-сирота позволяет родительской таблице удалять несколько записей (удалить сироту) в своей дочерней таблице.

Как включить каскад?

Каскад поддерживается как в файле сопоставления XML, так и в аннотации.

1. Файл сопоставления XML

В файле сопоставления XML объявлено ключевое слово cascade в переменной отношения.



      
            
      
      

2. Аннотация

В аннотации объявлен Тип каскада.SAVE_UPDATE (сохранить, обновить) и Каскадный тип. УДАЛИТЬ (удалить) в аннотации @Cascade.

        //Stock.java
        @OneToMany(mappedBy = "stock")
        @Cascade({CascadeType.SAVE_UPDATE, CascadeType.DELETE})
	public Set getStockDailyRecords() {
		return this.stockDailyRecords;
	}

Дальнейшее изучение – Каскад – JPA и спящий режим аннотация распространенная ошибка .

обратный против каскадного

И то, и другое – совершенно разные понятия, см. дифференциал здесь .

Вывод

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

Оригинал: “https://mkyong.com/hibernate/hibernate-cascade-example-save-update-delete-and-delete-orphan/”