Boa tarde
Preciso da ajuda dos amigos, pois ainda não entendo muito do hibernate.
Utilizando o método Session.saveOrUpdate, para um objeto novo (insert) o objeto é salvo corretamente, porém quando o objeto já existe no banco (update), o objeto não é atualizado. Nenhuma exception ocorre, todas as outras entidades de meu sistema estão salvando corretamente, a única “peculiaridade” dessa entidade é que ela possui um composite-id. Alguma dica?
Segue o código
public class SyncProduct extends BaseEntity {
private Equipment equipment;
private Product product;
public SyncProduct(){
super();
}
//getters and setters ...
}
public abstract class BaseEntity {
private long id;
private Date creationDate;
private Date lastUpdate;
private String idUpdUser;
//getters and setters ...
}
<class name="SyncProduct" table="sync_prod" schema="public">
<composite-id>
<key-many-to-one class="Equipment" column="cd_eqpmt"
foreign-key="fk_sync_eqpmt" lazy="false" name="equipment" />
<key-many-to-one class="br.com.xxx.core.product.Product" column="cd_prod"
foreign-key="fk_sync_prod" lazy="false" name="product" />
</composite-id>
<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_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_prod, cd_eqpmt),
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
)
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.
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.
[quote=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.[/quote]Eita, calma.
Você quer salvar apenas os atributos de uma classe apenas? então não precisa de cascade.
Como você está salvando?
Calma, você ta fazendo herança?
Você configurou herança no seu código?
Como configurei a herança?? O que exatamente você quer saber quando pergunta isso?
[quote=marceloamigo]Como configurei a herança?? O que exatamente você quer saber quando pergunta isso?[/quote]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.
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
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
)
As vezes tenho esse problema ao usar o SaveOrUpdate. Resolvi simplesmente usando o merge no lugar de SaveOrUpdate.