java - I can't get cascade to work on an entity,Hibernate -
i have entity has 2 many-to-one relationships, , 1 of them cascades on save fine , other 1 returns:
exception in thread "main" org.hibernate.transientobjectexception: object references unsaved transient instance - save transient instance before flushing : dto.publicschema.pessoas here code of entity works:
@entity @table(name="`doc_tipo`", schema="public") public class doc_tipo implements serializable { private static final long serialversionuid = 1859372890916956036l; @id @column(nullable=false) private int tp_doc; @column(nullable=false,columndefinition="char(255)") private string descricao; @column(nullable=false,columndefinition="char(255)") private string tp_emissor; //getters , setters } and here code of entity not allow cascade:
@entity @table(name="`pessoas`", schema="public") public class pessoas implements serializable { private static final long serialversionuid = 8292302132119274975l; @id @generatedvalue @column(nullable=false,columndefinition="serial not null") private int seq_pessoa; static date padrao_dt_criacao = new date(); @column(nullable=false, columndefinition="date not null") private date dt_criacao = padrao_dt_criacao; @column(columndefinition="char(255)") private string nome; @column(columndefinition="char(1) null") private char tp_pessoa; @column(columndefinition="char(255)") private string fantasia; @column(columndefinition="varchar(25)") private string idioma; @column(columndefinition="varchar(25)") private string login; @column(columndefinition="varchar(25)") private string senha; static date padrao_dt_i = new date(); @column(nullable=false, columndefinition="date not null") private date dt_i = padrao_dt_i; //pessoa está ativa para o sitema se este campo estiver em branco @column(columndefinition="date") private date dt_f; @column(columndefinition="oid") private int foto; //getters , setters } and here class has relationships many-to-one 2 above cascade work on first one:
@entity @table(name="`documentos`", schema="public") public class documentos implements serializable { private static final long serialversionuid = -4874330647877687810l; @id @manytoone(cascade=cascadetype.all) @joincolumn(name="seq_pessoa",columndefinition="integer",referencedcolumnname="seq_pessoa",nullable=false) private pessoas seq_pessoa; @id @generatedvalue @column(nullable=false,columndefinition="serial not null") private int cd_doc; @manytoone(cascade=cascadetype.all) @joincolumn(name="tp_doc",referencedcolumnname="tp_doc",nullable=false) private doc_tipo tp_doc; @column(nullable=false) private int tp_emissor; @column(nullable=false,columndefinition="char(2) not null default 'df'::bpchar") private string tp_emissor_uf="df"; @column(columndefinition="char(5)") private string alfa_doc; @column(nullable=false,columndefinition="char(20)") private string nr_doc; //data de validade documento @column(columndefinition="date") private date dt_f_valid; @transient transient static date padrao_dt_i = new date(); @column(columndefinition="date default now()") private date dt_i = padrao_dt_i; @column(columndefinition="date") private date dt_f; //getters , setters } when go save documentos object hibernate inserts doc_tipo in table supposed to, , instead of inserting pessoa object throws me exception.
here class manipulates session(it's tests):
public class hibernate { public static sessionfactory getsessionfactory() { sessionfactory sessionfactory = null; try { configuration configuration = new configuration(); configuration.configure(); serviceregistry serviceregistry = new serviceregistrybuilder().applysettings( configuration.getproperties()).buildserviceregistry(); sessionfactory = configuration.buildsessionfactory(serviceregistry); } catch (hibernateexception hbe) { hbe.printstacktrace(); } return sessionfactory; } public static void main(string[] args) { sessionfactory sessionfactory = getsessionfactory(); session session = sessionfactory.opensession(); session.begintransaction(); pessoas = new pessoas(); a.setdt_criacao(new date()); a.setdt_f(new date()); a.setdt_i(new date()); a.setfantasia("teste"); a.setfoto(12); a.setidioma("aa"); a.setlogin("aa"); a.setnome("aa"); a.setsenha("a"); a.settp_pessoa('h'); doc_tipo b = new doc_tipo(); b.setdescricao("aa"); b.settp_doc(5); b.settp_emissor("aaa"); documentos c = new documentos(); c.setalfa_doc("aaa"); c.setdt_f(new date()); c.setdt_f_valid(new date()); c.setdt_i(new date()); c.setnr_doc("aa"); c.setseq_pessoa(a); c.settp_doc(b); c.settp_emissor(1); c.settp_emissor_uf("aa"); //session.save(a); session.save(c); session.gettransaction().commit(); session.close(); } } if remove comment on save() pessoas object, works fine, shouldn't have that, same exception happens when try cascade save in entity has many-to-one relationship pessoas too.
documentos references pessoas primary key (pessoas.seq_pessoa) created after has been saved/flushed database pessoas uses serial. there nothing reference before save/persist happens.
also, shouldn't use multiple @id annotations define composite identity unless defining @idclass holds aforementioned @id fields. or @embeddedid annotation well. jpa supports 2 different approaches compound pks. in each case there must pk class includes fields.
a) multiple @id fields/attributes on entity. names , types of fields in entity must match in pk class. must have @idclass annotation on class. ex:
public class emppk { int id; string name; ... } @entity @idclass(emppk.class) public class employee { @id int id; @id string name; ... } b) embed attribute of pk class in entity. in case attribute marked @embeddedid , pk class must annotated @embeddable. ex:
@embeddable public class emppk { int id; string name; ... } @entity public class employee { @embeddedid emppk empid; ... }
Comments
Post a Comment