Hebert_Coelho 6 de nov. de 2012
Para atualizar todo mundo, você precisa utilizar cascade.
Aqui explicar como funciona: JPA: Mini Livro - Primeiros passos e conceitos detalhados .
No seu caso, apenas entenda como funciona e depois veja qual o comando correto para se colocar no xml.
marceloamigo 6 de nov. de 2012
A idéia não é atualizar todo mundo, somente os atributos da própria classe
private Date creationDate;
private Date lastUpdate;
private String idUpdUser;
Os valores desses atributos são alterados, mas não estão sendo salvos no banco através do método saveOrUpdate
obrigado pelo link, vou ler agora mesmo.
Hebert_Coelho 6 de nov. de 2012
marceloamigo:
A idéia não é atualizar todo mundo, somente os atributos da própria classe
private Date creationDate;
private Date lastUpdate;
private String idUpdUser;
Os valores desses atributos são alterados, mas não estão sendo salvos no banco através do método saveOrUpdate
obrigado pelo link, vou ler agora mesmo.
Eita, calma.
Você quer salvar apenas os atributos de uma classe apenas? então não precisa de cascade.
Como você está salvando?
Hebert_Coelho 6 de nov. de 2012
Calma, você ta fazendo herança?
Você configurou herança no seu código?
marceloamigo 6 de nov. de 2012
Como configurei a herança?? O que exatamente você quer saber quando pergunta isso?
Hebert_Coelho 6 de nov. de 2012
marceloamigo:
Como configurei a herança?? O que exatamente você quer saber quando pergunta isso?Sua classe SyncProduct herda de BaseEntity.
BaseEntity é uma entity? Se não, ela precisa ser ou uma Entity ou uma MappedSuperclass. Caso seja Entity é preciso que você crie uma herança.
No link que eu te passei mostra como funciona Herança e explica sobre MappedSuperclass.
marceloamigo 6 de nov. de 2012
Obrigado pelos esclarecimentos.
BaseEntity é a superclasse de todas entidades que persistem no banco.
BaseService é a superclasse que possui os métodos para persistência.
Por favor me corrija se utilizei algum termo incorreto.
public abstract class BaseService < T extends BaseEntity > {
protected Class < T > persistentClass ;
protected BaseServiceValidator baseServiceValidator ;
protected ExceptionFactory exceptionFactory ;
public BaseService ( Class < T > persistentClass , String moduleName ) {
this . persistentClass = persistentClass ;
this . exceptionFactory = ExceptionFactory . getInstance ( moduleName );
this . baseServiceValidator = BaseServiceValidator
. getInstance ( moduleName );
}
public void validateBeforeSave ( Collection < T > entities ) {
for ( T entity : entities ) {
validateBeforeSave ( entity );
}
}
public void validateBeforeRemove ( Collection < T > entities ) {
for ( T entity : entities ) {
validateBeforeRemove ( entity );
}
}
public void save ( T entity ) {
try {
validateBeforeSave ( entity );
saveOrUpdate ( entity );
} catch ( BusinessException e ) {
throw e ;
} catch ( Throwable t ) {
throwSystemException ( t );
}
}
// muitos outros métodos
marceloamigo 7 de nov. de 2012
Acredito que o problema estava ocorrendo devido ao composite-id que eu estava usando anteriormente, alterei conforme o código abaixo e passou a funcionar.
Fico grato caso alguém possa esclarecer o motivo de não estar salvando com o código anterior.
<class name= "SyncProduct" table= "sync_prod" schema= "public" >
<id name= "id" column= "cd_sync_prod" >
<generator class= "sequence" >
<param name= "sequence" > sync_prod_cd_sync_prod_seq</param>
</generator>
</id>
<many-to-one name= "equipment" class= "Equipment" lazy= "false"
fetch= "join" >
<column name= "cd_eqpmt" not-null= "true" />
</many-to-one>
<many-to-one name= "product"
class= "br.com.xxx.product.Product" lazy= "false" fetch= "join" >
<column name= "cd_prod" not-null= "true" />
</many-to-one>
<property name= "creationDate" >
<column name= "dt_creat" not-null= "true" />
</property>
<property name= "lastUpdate" >
<column name= "dt_upd" not-null= "true" />
</property>
<property name= "idUpdUser" >
<column name= "id_upd_user" not-null= "true" />
</property>
</class>
CREATE TABLE sync_prod
(
cd_sync_prod serial NOT NULL ,
cd_eqpmt integer NOT NULL ,
cd_prod integer NOT NULL ,
dt_creat timestamp ( 6 ) without time zone NOT NULL ,
dt_upd timestamp ( 6 ) without time zone NOT NULL ,
id_upd_user character varying ( 20 ) NOT NULL ,
CONSTRAINT pk_sync_prod PRIMARY KEY ( cd_sync_prod ),
CONSTRAINT fk_sync_eqpmt FOREIGN KEY ( cd_eqpmt )
REFERENCES equipment ( cd_eqpmt ) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION ,
CONSTRAINT fk_sync_prod FOREIGN KEY ( cd_prod )
REFERENCES product ( cd_prod ) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
iamthelegend 12 de nov. de 2012
As vezes tenho esse problema ao usar o SaveOrUpdate. Resolvi simplesmente usando o merge no lugar de SaveOrUpdate.