Qual o conceito desse 'Cascade = ALL'?

9 respostas
0

Ola galera!

Tenho 2 beans, aonde existe um relacionamento de 1 categoria p/ n produtos, que são os seguintes:

Produto:

@Entity
@Table(name="produtos")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)    
public class Produto implements Serializable {
	
	private static final long serialVersionUID = 1L;
	
	@Id
	@GeneratedValue(strategy=IDENTITY)
	private Integer id;

	@Column(name="desc_gd")
	@Lob  // campos com muitos caracteres, ex: campo text no html
	private String descGd;

	@Column(name="prod_nome")
	private String prodNome;

	private Double preco;
	
	private Double desconto;

	@Column(name="desc_peq")
	private String descPeq;
	
	private String imagem;
	
	@ManyToOne(fetch=LAZY)
	@JoinColumn(name="cat_id", referencedColumnName = "id")
	private Categoria cat;

	@OneToMany(mappedBy="produto", fetch = LAZY, cascade = ALL)
	private Set<ItensPedido> itens;
	

	public Produto() {
		super();
	}

	public Integer getId() {
		return this.id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getDescGd() {
		return this.descGd;
	}

	public void setDescGd(String descGd) {
		this.descGd = descGd;
	}

	public String getProdNome() {
		return this.prodNome;
	}

	public void setProdNome(String prodNome) {
		this.prodNome = prodNome;
	}

	public Double getPreco() {
		return this.preco;
	}

	public void setPreco(Double preco) {
		this.preco = preco;
	}

	public void setDesconto(Double desconto) {
		this.desconto = desconto;
	}

	public Double getDesconto() {
		return desconto;
	}	
	
	public String getDescPeq() {
		return this.descPeq;
	}

	public void setDescPeq(String descPeq) {
		this.descPeq = descPeq;
	}

	public String getImagem() {
		return this.imagem;
	}

	public void setImagem(String imagem) {
		this.imagem = imagem;
	}

	public Categoria getCat() {
		return this.cat;
	}

	public void setCat(Categoria cat) {
		this.cat = cat;
	}

	public Set<ItensPedido> getItens() {
		return itens;
	}

	public void setItens(Set<ItensPedido> itens) {
		this.itens = itens;
	}
}

Categoria:

@Entity
@Table(name="categorias")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Categoria implements Serializable {
	
	private static final long serialVersionUID = 1L;
	
	@Id
	@GeneratedValue(strategy=IDENTITY)
	private Integer id;

	@Column(name="cat_nome")
	private String catNome;

	@OneToMany(mappedBy="cat", fetch = LAZY, cascade = ALL)
	@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)    
	private Set<Produto> produtos;

	public Categoria() {
		super();
	}

	public Integer getId() {
		return this.id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getCatNome() {
		return this.catNome;
	}

	public void setCatNome(String catNome) {
		this.catNome = catNome;
	}

	public Set<Produto> getProdutos() {
		return this.produtos;
	}

	public void setProdutos(Set<Produto> produtos) {
		this.produtos = produtos;
	}
}

Gostaria de saber qual é conceito desta linha @OneToMany(mappedBy="cat", fetch = LAZY, cascade = ALL)?
Obs: meu foco é saber o ‘cascade = ALL’.

Se alguém puder me ajudar, desde já agradeço.

9 Respostas

TiagoW

Olá,

No seu exemplo, o Cascade=ALL fará com que todas as operações de persistencia executadas sobre um entity “Categoria” sejam replicadas para os entities “Produto” vinculados a ele.

Além do ALL, as outras opções de CascadeType são:
CascadeType.MERGE
CascadeType.PERSIST
CascadeType.REFRESH
CascadeType.REMOVE

alanbrasil1984

Cascade e como se fosse um cascata, ai se o atributo mapeado com esse tipo sofrera tudo oque o objeto que ele faz parte esta sofrendo

ex.

vc tem uma classe

Pessoa que tem emails.

se vc exluir pessoas ele exclui os emails.

e assim com todos os demais tipos citado pelo nosso amigo ai acima.

0

Vlw ae pela ajuda pessoal, com o delete eu saquei a parada, mas como isso funcionaria para o cascade = PERSIST ?

pois quando ele deleta uma categoria ele deletar os produtos vinculados a ele, isso eu entendi, mas como seria quando eu salva-se uma categoria? meu produto vinculado a categoria já esta salva.
???
desde já agradeço

alanbrasil1984

com o persiste é o seguinte,

Pesso pessoa  = new Pessoa();

pessoa.setNome("nome")

Emails email = new Emails();

email.setLogin("[email removido]");

pessoa.setEmail(email);

pessoaFacade.cadastrar(pessoa);

quando vc chamar essa função ele vai cadastrar os 2 tanto a pessoa quanto o email no banco.
Jair_Rillo_Junior

Cascade = Cascata.
Pense nele exatamente como uma cascata, o que estiver configurado nele, ele vai replicar para os objetos do relacionamento. Como no caso o Persist, vai persistir tb a classe do relacionamento.

Embora pareça pequena, essa propriedade é muito importante.

TiagoW

Para o Persist você pode pensar o seguinte:
Você tem 1 objeto Categoria que já têm 2 produtos por exemplo. Você inclui mais um produto na lista, assim quando você chamar em.persist(categoria); um novo registro será criado para o novo produto que foi inserido, e qualquer alteração que tenha sido feita nos dados dos dois produtos que já existiam será também persistida (update) no banco de dados ao fim da transação.

Para o Merge é o mesmo racioncínio:
Você tem um objeto Categoria com dois Produtos, todos DETACHED. Quando você chama
categoria = em.merge(categoria); será devolvido um objeto Categoria com os dois produtos no status MANAGED.

E a mesma coisa para REFRESH.

Andre_Fonseca

importante e bastante propensa a fortes dores de cabeça depois, principalmente se o seu banco não tiver as constraints necessárias para garantir a integridade dos dados… :smiley:

0

como saber quais são as constraints dos bancos de dados?
se eu fizer o mapeamento, por exemplo, para não deletar um produto quando eu deletar a categoria dele, se no banco não tiver esses tratamento, de nada adianta eu tratar no mapeamento?

desde já agradeço

Jair_Rillo_Junior

O que o André quis dizer quando nem o mapeamento e nem o banco tem constraints, porém no requisito do sistema diz que deve haver essa constraint. Resultado: o sistema vai começar a gerar dados inconsistentes sem ninguém saber. Esses são bugs dificeis de se encontrar

Criado 18 de agosto de 2009
Ultima resposta 18 de ago. de 2009
Respostas 9
Participantes 5