2

I have two tables with a one-to-many relationship. I want to fetch those records and insert into another database which having same table by changing the primary key.

My application entity class

@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
}

Address entity class..

@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
}

I have to execute a method for fetching records from DB using 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 ); 
}

After fetching the records, I am changing APPLICATION_ID, CUSTOMER_ID and some other columns in address table and after inserting in another database.

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 queries in console log are... (below mentioned queries are too large so copied to some extent only..)

 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 (?, ?, ?)

Question 1: in the insert method, I have assigned address to addresSet and made some changes in addresSet, after making those changes, I am not assigned the addressSet to applVO (i.e. not written applVO.setAddress(addresSet )) but it inserted a record with updated values into the Address table. What is happening here?

When I am changing code inside insertApplication(ApplicationTable emApplVO) method to

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 queries in console log are... It also executing update ...

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=?

Question 2: why is the update query executed?

Question 3: while using List<AddressTable> instead of Set<AddressTable>, I got some errors. What is the difference?

paardhu
  • 101
  • 8

0 Answers0