java - Hibernate retrieves only first record from database, rest is null -
i have uni project intended log sales and, based on set of pre established rules, determine of them eligible 4 kinds of aditionals: 2 bonuses (specific product , sales salesman) , 2 prizes (product campaign , best salesman). written using java (spring framework), , uses hibernate communicate mysql database , jsp presentation layer. while testing found sales bonus not working properly. though calculation performed , results stored in database, when trying retrieve them null value.
for instance, when performing calculation result shown in jsp is
from | | salesman | bonus | prizes | sales | product | best salesman | campaign --------------------------------------------------------------------------------- 01/01/2013 22/11/2013 salesman 1 no no no no 01/01/2013 22/11/2013 salesman 2 yes yes no yes 01/01/2013 22/11/2013 salesman 3 yes yes no no 01/01/2013 22/11/2013 salesman 4 no no no no
but after refreshing it, involves getting results database, shows
from | | salesman | bonus | prizes | sales | product | best salesman | campaign --------------------------------------------------------------------------------- 01/01/2013 22/11/2013 salesman 2 yes yes no yes 01/01/2013 22/11/2013 salesman 3 no yes no no
and if check salesbonus table via phpmyadmin get
id datecreation datefrom dateto total units salesman_id --------------------------------------------------------------------- 1 2014-02-05 2013-01-01 2013-11-22 200 1 2 4 2014-02-05 2013-01-01 2013-11-22 200 3 3
futhermore, if run using debug, variables tree shows
allbonuses arraylist<e> (id=491) elementdata object[3] (id=502) [0] aditional (id=503) productcampaignregistry prize (id=506) productbonus persistentbag (id=507) salesbonusregistry salesbonus (id=508) datecreation timestamp (id=509) datefrom timestamp (id=510) dateto timestamp (id=511) id 1 bestsalesman null salesman salesman (id=512) active true lastname "noble" (id=513) id 2 name "donna" (id=514) [1] aditional (id=504) productcampaignregistry null productbonus persistentbag (id=515) salesbonusregistry null (should id 4 in salesbonus table) datecreation timestamp (id=516) datefrom timestamp (id=517) dateto timestamp (id=518) id 2 bestsalesman null salesman salesman (id=519) active true lastname "dent" (id=520) id 3 name "arthur" (id=521)
which means salesbonus registry shown in bonuses table has been stored, somehow not appear when retrieving aditional registry belongs.
to make sure issue deleted entire database, created again, inserted new salesman , sales , performed calculation should insert new salesbonus registry. unfortunately, issue repeated.
the classes these
@entity public class aditional implements serializable { @transient private static final long serialversionuid = 1l; @id @generatedvalue(strategy = generationtype.auto) private int id; @column(nullable=false) private date datecreation; @column(nullable=false) private date datefrom; @column(nullable=false) private date dateto; @manytoone private salesman salesman; @onetoone @joincolumn(name="id") private salesbonus salesbonusregistry; @manytomany(cascade=cascadetype.all, fetch= fetchtype.eager) @fetch(value = fetchmode.subselect) private list<productbonus> productbonuses; @onetoone @joincolumn(name="id") private prize bestsalesman; @onetoone @joincolumn(name="id") private prize productcampaign; @entity @inheritance(strategy=inheritancetype.table_per_class) @discriminatorcolumn(name="type", discriminatortype=discriminatortype.string) public class bonus implements serializable { @transient private static final long serialversionuid = 1l; @id @generatedvalue(strategy = generationtype.table) private int id; @column(nullable=false) private date datecreation; @column(nullable=false) private date datefrom; @column(nullable=false) private date dateto; @manytoone(cascade=cascadetype.all, fetch= fetchtype.eager) private salesman salesman; @column(nullable=false) private int units=0; @column(nullable=false) private float total=0; @entity @discriminatorvalue(value="s") public class salesbonus extends bonus{ @transient private static final long serialversionuid = 1l; @manytomany(cascade=cascadetype.all, fetch= fetchtype.eager) @fetch(value = fetchmode.subselect) private list<sale> elements;
the method used in servlet in question is
protected void doget(httpservletrequest request, httpservletresponse response) throws servletexception, ioexception { setuser((user) request.getsession().getattribute("user")); if (getuser()==null) { response.sendredirect(request.getcontextpath() + "/login"); return; } if (!checkrole(getuser())) { response.sendredirect(request.getcontextpath() + "/error"); return; } request.setattribute("salesmen", service.getactivesalesmen()); request.setattribute("products", service.getproducts()); request.setattribute("aditionals", service.getaditionals()); request.getrequestdispatcher("/web-inf/computeaditionals.jsp").forward(request, response); }
this method used in service layer retrieve aditional registries
@override public arraylist<aditional> getaditionals() { arraylist<aditional> = dataaccess.getaditionals(); (aditional aditional : all) { if (aditional.getcampaign()!=null && aditional.getcampaign().getproduct()==null) aditional.setcampaign(null); if (aditional.getbestsalesman()!=null && aditional.getbestsalesman().getproduct()!=null) aditional.setbestsalesman(null); } return all; }
this method used in dataacesshibernatetemplate
@override public arraylist<aditional> getaditionals() { return (arraylist<aditional>) this.hibernatetemplate.loadall(aditional.class); }
and when trying retrieve productbonus registries uses this
@override public productbonus getproductbonus(integer id) { return this.hibernatetemplate.get(productbonus.class, id); }
thanks in advanced!
edit: (slightly edited) slf4j output when adicional registries loaded
18:34:33,853 debug abstractbatcher:410 - open preparedstatement (open preparedstatements: 0, globally: 0) 18:34:33,853 debug connectionmanager:444 - opening jdbc connection 18:34:33,881 debug sql:111 - select this_.id id5_6_, this_.creationdate creation2_5_6_, this_.datefrom datefrom5_6_, this_.dateto dateto5_6_, this_.salesman_id salesman5_5_6_, salesman2_.id id3_0_, salesman2_.active active3_0_, salesman2_.lastname lastname3_0_, salesman2_.name name3_0_, prize3_.id id9_1_, prize3_.creationdate creation2_9_1_, prize3_.datefrom datefrom9_1_, prize3_.dateto dateto9_1_, prize3_.total total9_1_, prize3_.iscampaign iscampaign9_1_, prize3_.prizewinner_id prizewin7_9_1_, prize3_.product_id product8_9_1_, salesman4_.id id3_2_, salesman4_.active active3_2_, salesman4_.lastname lastname3_2_, salesman4_.name name3_2_, product5_.id id2_3_, product5_.name name2_3_, product5_.costunit costunit3_2_3_, salesbonus6_.id id6_4_, salesbonus6_.creationdate creation2_6_4_, salesbonus6_.datefrom datefrom6_4_, salesbonus6_.dateto dateto6_4_, salesbonus6_.total total6_4_, salesbonus6_.units units6_4_, salesbonus6_.salesman_id salesman7_6_4_, salesman7_.id id3_5_, salesman7_.active active3_5_, salesman7_.lastname lastname3_5_, salesman7_.name name3_5_ (adicional this_ left outer join salesman salesman2_ on (this_.salesman_id=salesman2_.id left outer join prize prize3_ on (this_.id=prize3_.id left outer join salesman salesman4_ on (prize3_.prizewinner_id=salesman4_.id left outer join product product5_ on (prize3_.product_id=product5_.id left outer join salesbonus salesbonus6_ on (this_.id=salesbonus6_.id left outer join salesman salesman7_ on salesbonus6_.salesman_id=salesman7_.id)))))) 18:34:33,881 trace abstractbatcher:513 - preparing statement 18:34:33,886 debug abstractbatcher:426 - open resultset (open resultsets: 0, globally: 0) 18:34:33,890 trace basicextractor:71 - found [2] column [id3_0_] 18:34:33,891 trace basicextractor:66 - found [null] column [id9_1_] 18:34:33,891 trace basicextractor:66 - found [null] column [id3_2_] 18:34:33,891 trace basicextractor:66 - found [null] column [id2_3_] 18:34:33,892 trace basicextractor:71 - found [1] column [id6_4_] 18:34:33,892 trace basicextractor:71 - found [2] column [id3_5_] 18:34:33,893 trace basicextractor:71 - found [1] column [id5_6_] 18:34:33,895 trace basicextractor:71 - found [true] column [active3_0_] 18:34:33,896 trace basicextractor:71 - found [noble] column [lastname3_0_] 18:34:33,896 trace basicextractor:71 - found [donna] column [name3_0_] 18:34:33,907 trace basicextractor:71 - found [2013-12-20 20:17:34.0] column [creation2_6_4_] 18:34:33,908 trace basicextractor:71 - found [2013-01-01 00:00:00.0] column [datefrom6_4_] 18:34:33,908 trace basicextractor:71 - found [2013-11-22 00:00:00.0] column [dateto6_4_] 18:34:33,909 trace basicextractor:71 - found [200.0] column [total6_4_] 18:34:33,909 trace basicextractor:71 - found [1] column [units6_4_] 18:34:33,909 trace basicextractor:71 - found [2] column [salesman7_6_4_] 18:34:33,910 trace basicextractor:71 - found [2013-12-20 20:17:34.0] column [creation2_5_6_] 18:34:33,910 trace basicextractor:71 - found [2013-01-01 00:00:00.0] column [datefrom5_6_] 18:34:33,910 trace basicextractor:71 - found [2013-11-22 00:00:00.0] column [dateto5_6_] 18:34:33,910 trace basicextractor:71 - found [2] column [salesman5_5_6_] 18:34:33,911 trace basicextractor:71 - found [3] column [id3_0_] 18:34:33,911 trace basicextractor:66 - found [null] column [id9_1_] 18:34:33,911 trace basicextractor:66 - found [null] column [id3_2_] 18:34:33,911 trace basicextractor:66 - found [null] column [id2_3_] 18:34:33,911 trace basicextractor:66 - found [null] column [id6_4_] 18:34:33,912 trace basicextractor:66 - found [null] column [id3_5_] 18:34:33,912 trace basicextractor:71 - found [2] column [id5_6_] 18:34:33,912 trace basicextractor:71 - found [true] column [active3_0_] 18:34:33,912 trace basicextractor:71 - found [dent] column [lastname3_0_] 18:34:33,912 trace basicextractor:71 - found [arthur] column [name3_0_] 18:34:33,913 trace basicextractor:71 - found [2013-12-20 20:17:34.0] column [creation2_5_6_] 18:34:33,913 trace basicextractor:71 - found [2013-01-01 00:00:00.0] column [datefrom5_6_] 18:34:33,913 trace basicextractor:71 - found [2013-11-22 00:00:00.0] column [dateto5_6_] 18:34:33,914 trace basicextractor:71 - found [3] column [salesman5_5_6_] 18:34:33,914 debug abstractbatcher:433 - close resultset (open resultsets: 1, globally: 1) 18:34:33,914 debug abstractbatcher:418 - close preparedstatement (open preparedstatements: 1, globally: 1) 18:34:33,914 trace abstractbatcher:562 - closing statement 18:34:33,923 debug abstractbatcher:410 - open preparedstatement (open preparedstatements: 0, globally: 0)
this makes me think may related sql query, although how explain fact first registry loaded? =\
solved. mapping issue. adding proper join column , remapping database did trick.
so, modified aditional class is.
@entity public class aditional implements serializable { @transient private static final long serialversionuid = 1l; @id @generatedvalue(strategy = generationtype.auto) private int id; @column(nullable=false) private date datecreation; @column(nullable=false) private date datefrom; @column(nullable=false) private date dateto; @manytoone private salesman salesman; @onetoone @joincolumn(name="salesbonus_id") private salesbonus salesbonusregistry; @manytomany(cascade=cascadetype.all, fetch= fetchtype.eager) @fetch(value = fetchmode.subselect) private list<productbonus> productbonuses; @onetoone @joincolumn(name="salesmanprize_id") private prize bestsalesman; @onetoone @joincolumn(name="campaignprize_id") private prize productcampaign;
Comments
Post a Comment