Pergunta

Eu tenho produtos objetos que pertencem a determinadas categorias ou seja clássica muitos para um relacionamento.

@Entity
public class Product{

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    Long id;

    String name;
    Double price;
    @ManyToOne(fetch = FetchType.LAZY)
    Category category;
...
}

@Entity
public class Category implements Identifiable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String name;
...
}

Eu quero inserir e atualizar produtos sem pré-selecção categorias. Como esta:

Product product = dao.get(productId);
Category category = dao.get(categoryId);
product.setCategory(category);
dao.update(product);

ou

Product product = new Product(somename);
Category category = dao.get(categoryId);
product.setCategory(category);
dao.insert(product);

É possível atualizar e inserir Categoria Sem seleção? Eu não quero usar HQL ou consultas directas para isso.

Foi útil?

Solução

session.load () existe especificamente para casos como este. O seguinte:

Category category = session.load(categoryId);
product.setCategory(category);

não vai bater o banco de dados. Será, no entanto, lançar uma exceção em um estágio posterior (durante o flush, mais ou menos) se não houver nenhuma categoria disponível com dado id.

Usando load() é mais rápido que merge() e não tem efeitos colaterais (em cascata, etc ...)

Outras dicas

O Hibernate precisa de uma maneira segura de determinar o estado de seu objeto. É por isso que ele vai um longo caminho para se certificar de que você não pode misturar objetos de diferentes sessões (para que você não pode carregar as categorias na inicialização e depois é só usá-los mais tarde).

A solução é carregar as categorias na inicialização, configurar um provedor de cache como ehcache para esta classe e, em seguida, usar este código:

Product product = new Product(somename);
product.setCategory(session.merge(category));

Isso não causa nenhum idas DB se você configurar o cache que as instâncias categoria não pode mudar.

Eu apenas tentei seguinte:

Category category = new Category(categoryId);
product.setCategory(category);

E funcionou, eu registro do produto média na db tem link correto para categoria e categoria com id

categoryId

não mudaram.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top