spring - Hibernate annotations-Question on one to many relationship with composite primary key -
first of all, kindly @ design,
i have 2 tables t1(a,b,c,d)- primary key t2(a,e) (a,e) composite primary key foreign key referencing t1(a)
t1 - t2 relationship 1 many.
so created 3 classes
c1 t1 has 5 fields - a,b,c,d, c2set setters & getters
c2 t2 has 2 fields- c1,c3 of type c1, c3 respectively- setters & getters
c3 defining c3 represent composite primary key of t2 has 2 fields (a,e) setters & getters
i using following annotations define hibernate mappings in classes c1,c2,c3 respectively
1.
@entity @table(name = "t1", schema = "dbo", uniqueconstraints = { @uniqueconstraint(columnnames = "a") }) @id @column(name = "a", unique = true, nullable = false) @transient private set<c2> c2set = new hashset<c2>(); @onetomany(fetch = fetchtype.eager, mappedby = "c1") public set<c2> getc2set() { return c2set; }
2.
@entity @table(name="t2", schema = "dbo") @id public c3 getc3() { return c3; } private c1 c1; @manytoone(fetch = fetchtype.eager) @joincolumn(name = "a",insertable= false, updatable=false) public c1 getc1() { return c1; }
3.
@embeddable @column(name = "a") public string geta() { return a; } @column(name="e") public string gete() { return e; } @service public class c1serviceimpl implements c1service { @autowired @qualifier("transactionproxy") private genericdao genericdao; public genericdao getgenericdao() { return genericdao; } public void setgenericdao(genericdao genericdao) { this.genericdao = genericdao; } @override public void registerc1() { c1 c1=new c1(); c1.seta("avalue"); c1.setb("somevalue"); c1.setc("somevalue"); c1.setd("somevalue"); c3 compositekey1 = new c3(); compositekey1.seta("avalue"); compositekey1.sete("e1"); c3 compositekey2 = new c3(); compositekey1.seta("avalue"); compositekey1.sete("e2"); c2 c2_1=new c2(); c2_1.setc3(compositekey1); c2 c2_2=new c2(); c2_2.setc3(compositekey2); set<c2> eset = new hashset<c2>(); eset.add(c2_1); eset.add(c2_2); c1.setroles(eset);----------------------important genericdao.registeruser(c1); } } @repository @transactional public class hibernatedao implements genericdao { @autowired private sessionfactory sessionfactory; public sessionfactory getsessionfactory() { return sessionfactory; } public void setsessionfactory(sessionfactory sessionfactory) { this.sessionfactory = sessionfactory; } private session currentsession() { return sessionfactory.getcurrentsession(); } @override public void registerc1(c1 c1) { session session = currentsession(); session.begintransaction(); session.save(c1);----------------------------------------- here feel insertion should happen in both t1 & t2 tables. should should do, should insert t2 in same way doing t1 session.gettransaction().commit(); } } <bean id="datasource" class="org.apache.commons.dbcp.basicdatasource" destroy-method="close"> <property name="driverclassname" value="com.microsoft.sqlserver.jdbc.sqlserverdriver" /> <property name="url" value="xxxxxxxxxxxxxxxxxxxxxxx" /> <property name="username" value="dddddd" /> <property name="password" value="eeeeee" /> </bean> <bean id="sessionfactory" class="org.springframework.orm.hibernate3.annotation.annotationsessionfactorybean"> <property name="datasource" ref="datasource" /> <property name="packagestoscan" value="<package in c1,c2,c3,generic dao, hibernatedao live>" /> <property name="annotatedclasses"> <list> <value>fully qualified name of c1</value> </list> </property> <property name="hibernateproperties"> <props> <prop key="hibernate.current_session_context_class">thread</prop> <prop key="hibernate.transaction.factory_class">org.hibernate.transaction.jdbctransactionfactory </prop> <prop key="dialect">org.hibernate.dialect.sqlserverdialect</prop> <prop key="hibernate.show_sql">true</prop> </props> </property> </bean> <bean id="mytxmanager" class="org.springframework.orm.hibernate3.hibernatetransactionmanager"> <property name="sessionfactory" ref="sessionfactory" /> </bean> <bean id="transactionproxy" class="org.springframework.transaction.interceptor.transactionproxyfactorybean"> <property name="proxytargetclass" value="true" /> <property name="transactionmanager"> <ref bean="mytxmanager" /> </property> <property name="transactionattributes"> <props> <prop key="*">propagation_required</prop> </props> </property> <property name="target"> <bean class="fully qualified name of hibernatedao"> <property name="sessionfactory" ref="sessionfactory" /> </bean> </property> </bean>
i have problem when inserting(saving) data. data t1 getting inserted no insertion happening in t2( think should happen automatically here) ? please tell me doing things wrongly. and, want learn more hibernate annotations. can point me useful online resources.
and, separate form bean entity class? please tell me resources can learn about
hibernate doesn't persist objects referenced relationships default. need configure cascading of relationship make hibernate it:
@onetomany(fetch = fetchtype.eager, mappedby = "c1", cascade = cascadetype.all) public set<c2> getc2set() { return c2set; }
see also:
Comments
Post a Comment