java - Hibernate: how to deal with Session in DAO to set associations properly? -


i can't find solution setting associations using dao. needs explain. there 3 entities: bank, client , account. bank , client have bidirectional many-to-many association, client , account have one-to-many association. there genericdao interface implemented each entity's dao. application not-multithreading decided realize session-per-request "pattern" opening , closing session in each method of dao-interface implementations. please take @ code. problem described below code.

bank pojo

@entity @table(name = "bank") public class bank {      private int bankid;     private string bankname;     private set<client> setofclients;      @id     @generatedvalue(strategy = generationtype.identity)     @column(name = "bank_id")     public int getbankid() {         return bankid;     }      public void setbankid(int bankid) {         this.bankid = bankid;     }      @column(name = "bank_name")     public string getbankname() {         return bankname;     }      public void setbankname(string bankname) {         this.bankname = bankname;     }      @manytomany(mappedby = "setofbanks", fetch = fetchtype.eager)     public set<client> getsetofclients() {         return setofclients;     }      public void setsetofclients(set<client> setofclients) {         this.setofclients = setofclients;     } }** 

client pojo

@entity @table(name = "client") public class client {      private int clientid;     private string firstname;     private string secondname;     private set<account> setofaccounts;     private set<bank> setofbanks;      @id     @generatedvalue(strategy = generationtype.identity)     @column(name = "client_id")     public int getclientid() {         return clientid;     }      public void setclientid(int clientid) {         this.clientid = clientid;     }      @column(name = "first_name")     public string getfirstname() {         return firstname;     }      public void setfirstname(string firstname) {         this.firstname = firstname;     }      @column(name = "second_name")     public string getsecondname() {         return secondname;     }      public void setsecondname(string secondname) {         this.secondname = secondname;     }      @onetomany(mappedby = "clientid", cascade = {cascadetype.all})     public set<account> getsetofaccounts() {         return setofaccounts;     }      public void setsetofaccounts(set<account> setofaccounts) {         this.setofaccounts = setofaccounts;     }      @manytomany(targetentity = bank.class, cascade = {cascadetype.all}, fetch = fetchtype.eager)     @jointable(             name = "bank_client",             joincolumns = {@joincolumn(name = "client_id", nullable = false, referencedcolumnname = "client_id")},             inversejoincolumns = {@joincolumn(name = "bank_id", nullable = false, referencedcolumnname = "bank_id")}     )     public set<bank> getsetofbanks() {         return setofbanks;     }      public void setsetofbanks(set<bank> setofbanks) {         this.setofbanks = setofbanks;     } } 

clientdao

public class clientdao<client> implements genericdao<client>{      private session session;      @override     public void saveentity(client entity) {         try {             session = sessionfactoryutil.getsessionfactory().opensession();             session.gettransaction().begin();             session.save(entity);             session.gettransaction().commit();         } catch (hibernateexception e) {             session.gettransaction().rollback();             e.printstacktrace();         } {             session.close();         }     }      @override     public void deleteentity(client entity) {         try {             session = sessionfactoryutil.getsessionfactory().opensession();             session.gettransaction().begin();             session.delete(entity);             session.gettransaction().commit();         } catch (hibernateexception e) {             session.gettransaction().rollback();             e.printstacktrace();         } {             session.close();         }      }      @override     public void updateentity(object entity) {         try {             session = sessionfactoryutil.getsessionfactory().opensession();             session.gettransaction().begin();             session.update(entity);             session.gettransaction().commit();         } catch (hibernateexception e) {             session.gettransaction().rollback();             e.printstacktrace();         } {             session.close();         }     }      @override     public client getentitybyid(int id) {         client client = null;         try {             session = sessionfactoryutil.getsessionfactory().opensession();             session.gettransaction().begin();             client = (client) session.get(model.entity.client.class, id);         } catch (hibernateexception e) {             session.gettransaction().rollback();             e.printstacktrace();         } {             session.close();         }         return client;     }      @override     public list<client> getallentities() {         list<client> result = null;         try {             session = sessionfactoryutil.getsessionfactory().opensession();             session.gettransaction().begin();             result = session.createquery("from client").list();             session.gettransaction().commit();         } catch (hibernateexception e) {             if (session != null) {                 session.gettransaction().rollback();             }             e.printstacktrace();         } {             session.close();         }         return result;     } } 

bankdao has similar methods realization relating bank-entity specification

main-method

public class main {         public static void main(final string[] args) {              clientdao<client> clientdao = new clientdao<client>();             bankdao<bank> bankdao = new bankdao<bank>();              client client = clientdao.getentitybyid(11);             bank bank = bankdao.getentitybyid(3);              set<bank> setofbanks = client.getsetofbanks();             setofbanks.add(bank);              set<client> setofclients = bank.getsetofclients();             setofclients.add(client);         } } 

i didn't mention there entermediate table contains values of foreign keys of client-table anb bank-table (it needs reflect many-to-many association). result of main-method invokation supposed new added values in intermediate table (foreign keys of client , bank tables). proves association established. when call main-method happens nothing. understand when setofbanks.add(bank) , setofclients.add(client) objects added in collections don't relate persistent objects because session closed. , don't know how correctly open , close session in order establish association within session. hope describe issue clearly. appreciate reply.

what have implemented looks more session-per-operation anti-pattern session-per-request pattern imo. "session-per-request" refers request in client-server or web application, request involves multiple database operations.

it harder apply pattern command-line application yours, closest thing request in case fact of running app command-line. agree nachokk should open session @ beginning of main method , close @ end.


Comments

Popular posts from this blog

javascript - RequestAnimationFrame not working when exiting fullscreen switching space on Safari -

jsf - How to ajax update an item in the footer of a PrimeFaces dataTable? -

django - CSRF verification failed. Request aborted. CSRF cookie not set -