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
Post a Comment