Зачем использовать Set в OneToMany Mapping в спящем режиме - PullRequest
0 голосов
/ 05 июня 2018

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

Мой класс сущности приложения

@Entity
@Table(name = "EM_APPLICATION")
public class ApplicationTable  {

    @Id
    private int APPLICATION_ID;
    @Id
    private String CUSTOMER_ID;
    private String LAST_NAME;
    private String FIRST_NAME;

@OneToMany( fetch = FetchType.EAGER,cascade = CascadeType.ALL)
@JoinColumns({ @JoinColumn(name = "CUSTOMER_ID", referencedColumnName = "CUSTOMER_ID"),
        @JoinColumn(name = "APPLICATION_ID", referencedColumnName = "APPLICATION_ID") })
private Set<AddressTable> address;

//Getters and setters
}

Класс сущности адреса ..

@Entity
@Table(name="EM_APPL_ADDRESS")
public class AddressTable{
    @Id
    private int APPLICATION_ID;
    @Id
    private String CUSTOMER_ID;
    @Id
    private String ADDRESS_TYPE;
    //Getters and setters
}

Мне нужно выполнить метод для извлечения записей из БД с использованием hibernate:

public void execute(String applId, String customerId) {

    Session session = HibernateQAUtil.openSession();
    Transaction tx = session.beginTransaction();

    String hql = "FROM  ApplicationTable  WHERE CUSTOMER_ID =:CUSTOMER_ID AND APPLICATION_ID =:APPLICATION_ID";
    Query query = session.createQuery(hql);
    query.setParameter("CUSTOMER_ID", customerId);
    query.setParameter("APPLICATION_ID", Integer.parseInt(applId));

    List<ApplicationTable> list = query.list();
    tx.commit();
    session.close();
    ApplicationTable applVO = list.get(0);

    insertApplication(applVO ); 
}

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

private void insertApplication(ApplicationTable emApplVO) {

    applVO.setAPPLICATION_ID(123456);
    applVO.setCUSTOMER_ID("88888888");

    Set<AddressTable> addressSet = emApplVO.getAddress();
    for (AddressTable address : addressSet) {
        address.setAPPLICATION_ID(123456);  
        address.setCUSTOMER_ID("88888888");
        address.setZIP(500032);
    }

    Session session1 = HibernateUtil.openSession();
    Transaction beginTransaction = session1.beginTransaction();

    session1.save(emApplVO);
    beginTransaction.commit();
    session1.close();
}

Запросы Hibernate в журнале консоли ... (нижеприведенные запросы слишком велики, поэтому копируются только в некоторой степени ..)

 Hibernate: select em_applica0_.CUSTOMER_ID as CUSTOMER1_0_,em_applica0_.APPLICATION_ID as APPLICAT2_0_,em_applica0_.ARCHIVE_IND as ARCHIVE8_0_ where em_applica0_.CUSTOMER_ID=? and em_applica0_.APPLICATION_ID=?
 Hibernate: select address0_.CUSTOMER_ID as CUSTOMER1_0_1_, address0_.APPLICATION_ID as APPLICAT2_0_1_, address0_.ADDRESS_TYPE as ADDRESS3_1_0_ where em_applica0_.CUSTOMER_ID=? and em_applica0_.APPLICATION_ID=?

 Hibernate: insert into EM_APPLICATION (CUSTOMER_ID, APPLICATION_ID, APPLICATION_NBR, APPLICATION_STATUS, APPLICATION_TYPE) values (?, ?, ?, ?)
 Hibernate: insert into EM_APPL_ADDRESS (CUSTOMER_ID, APPLICATION_ID, ADDRESS_TYPE) values (?, ?, ?)

Вопрос 1 : в методе вставки я назначил адрес для addresSet и внес некоторые изменения в addresSet, после внесения этих изменений мне не присваивается addressSet для applVO (т.е. не написано applVO.setAddress (addresSet))но он вставил запись с обновленными значениями в таблицу Address.Что здесь происходит?

Когда я меняю код внутри метода insertApplication(ApplicationTable emApplVO) на

private void insertApplication(ApplicationTable emApplVO) {

    applVO.setAPPLICATION_ID(123456);
    applVO.setCUSTOMER_ID("88888888");

    Set<AddressTable> addressSet = emApplVO.getAddress();
    Set<AddressTable> newAddressSet = new HashSet<AddressTable>();
    for (AddressTable address : newAddressSet) {

        address.setAPPLICATION_ID(emApplVO.getAPPLICATION_ID());
        address.setCUSTOMER_ID(emApplVO.getCUSTOMER_ID());
        address.setZIP(500032);
        newAddressSet.add(address);
    }
    emApplVO.setAddress(null);
    emApplVO.setAddress(newAddressSet);

    Session session1 = HibernateUtil.openSession();
    Transaction beginTransaction = session1.beginTransaction();

    session1.save(emApplVO);
    beginTransaction.commit();
    session1.close();
 }

Запросы Hibernate в журнале консоли ... Это также выполняет обновление ...

Hibernate: select em_applica0_.CUSTOMER_ID as CUSTOMER1_0_,em_applica0_.APPLICATION_ID as APPLICAT2_0_,em_applica0_.ARCHIVE_IND as ARCHIVE8_0_ where em_applica0_.CUSTOMER_ID=? and em_applica0_.APPLICATION_ID=?
 Hibernate: select address0_.CUSTOMER_ID as CUSTOMER1_0_1_, address0_.APPLICATION_ID as APPLICAT2_0_1_, address0_.ADDRESS_TYPE as ADDRESS3_1_0_ where em_applica0_.CUSTOMER_ID=? and em_applica0_.APPLICATION_ID=?

 Hibernate: insert into EM_APPLICATION (CUSTOMER_ID, APPLICATION_ID, APPLICATION_NBR, APPLICATION_STATUS, APPLICATION_TYPE) values (?, ?, ?, ?)
 Hibernate: insert into EM_APPL_ADDRESS (CUSTOMER_ID, APPLICATION_ID, ADDRESS_TYPE) values (?, ?, ?)
update EM_APPL_ADDRESS set CUSTOMER_ID=?, APPLICATION_ID=? where CUSTOMER_ID=? and APPLICATION_ID=? and ADDRESS_TYPE=?

Вопрос 2 : почему выполняется запрос на обновление?

Вопрос 3 : при использовании List<AddressTable> вместо Set<AddressTable> я получилнекоторые ошибки.В чем разница?

...