[RESOLVIDO] Hibernate : relacionar apenas para obter dados

1 resposta
V

Pessoal,

Estou usando o Hibernate 4.2.

Tenho as seguintes classes: Modelo, Classificacao e Montadora.

Modelo deve se relacionar com Montadora pelo campo id_montadora, como também com Classificacao com o campo id_classificacao.

Quando vou incluir um modelo, no form eu seleciono qual a classificação e a montadora, estes dois últimos são registros já existentes no BD. Ao confirmar para gravar o modelo, surge o seguinte erro no console, impossibilitando a gravação do registro:

[color=red]SEVERE: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: modulo3_model.Classificacao[/color]

Acredito que tal problema esteja no fato de eu estar gravando em Modelo e não cuidei de gravar antes em Classificacao e Montadora. Mas aí é que está o problema: eu não necessito gravar nada em Classificacao e Montadora, mas sim somente em Modelo.

O relacionamento que necessito da classe Modelo com Classificacao e Montadora é apenas para facilitar na obtenção dos dados da tabela Modelo via Hibernate.

Como devo proceder?

hibernate.cfg.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property>
        <property name="hibernate.connection.driver_class">org.postgresql.Driver</property>
        <property name="hibernate.connection.url">jdbc:postgresql://localhost:5432/locadora</property>
        <property name="hibernate.connection.username">locadora</property>
        <property name="hibernate.connection.password">locadora</property>
        <property name="hibernate.show_sql">true</property>
        <property name="hibernate.format_sql">true</property>
        <property name="hibernate.query.factory_class">org.hibernate.hql.internal.classic.ClassicQueryTranslatorFactory</property>                                              
        <property name="hibernate.hbm2ddl.auto">update</property>
        <property name="current_session_context_class">thread</property>
        <mapping class="modulo3_model.Classificacao"/>
        <mapping class="modulo3_model.Cor"/>
        <mapping class="modulo3_model.Modelo"/>
        <mapping class="modulo3_model.Montadora"/>
    </session-factory>
</hibernate-configuration>
HibernateUtil:
package modulo3_DAO;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;

public class HibernateUtil {

//    private static final SessionFactory sessionFactory = buildSessionFactory();
    private static ServiceRegistry serviceRegistry;  
    private static SessionFactory sessionFactory = buildSessionFactory();  
    
    private static SessionFactory buildSessionFactory() {
        try {
            // Create the SessionFactory from hibernate.cfg.xml
            Configuration configuration = new Configuration();
            configuration.configure("hibernate.cfg.xml");
            serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
            sessionFactory = configuration.buildSessionFactory(serviceRegistry);
            return sessionFactory;
        } catch (Throwable ex) {
            // Make sure you log the exception, as it might be swallowed
            System.err.println("Falha na criação inicial da SessionFactory: " + ex);
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static Session getSession() {
        return sessionFactory.openSession();
    }
}
Modelo.java:
package modulo3_model;

import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

@Entity
@Table(name = "modelos")
@SequenceGenerator(name = "modelo_sequencia", sequenceName = "modelo_sequencia_id", allocationSize = 1)
public class Modelo implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY, generator = "modelo_sequencia")
    private Long id;
    @Column(length = 30)
    private String descricao;
    @JoinColumn(name = "id_montadora")
    @ManyToOne
    private Montadora montadora;
    @ManyToOne()
    @JoinColumn(name = "id_classificacao")
    private Classificacao classificacao;
    private int ano;
...
Classificacao.java:
package modulo3_model;

import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

@Entity
@Table(name = "classificacoes")
@SequenceGenerator(name = "classificacao_sequencia", sequenceName = "classificacao_sequencia_id", allocationSize = 1)
public class Classificacao implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY, generator = "classificacao_sequencia")
    private Long id;
    @Column(length = 30)
    private String descricao;
...
Montadora.java:
package modulo3_model;

import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

@Entity
@Table(name = "montadoras")
@SequenceGenerator(name = "montadora_sequencia", sequenceName = "montadora_sequencia_id", allocationSize = 1)
public class Montadora implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY, generator = "montadora_sequencia")
    private Long id;

    @Column(length = 20)
    private String nome;

    @Column(length = 5)
    private String sigla;
...

1 Resposta

V

Pessoal,

Demorei para descobrir a bronca, mas a solução foi bem simples.

Acreditava que não necessitaria de um setter para os ids de Classificacao e Montadora, pois eles seriam gerados automaticamente. Porém, na classe Modelo eu preciso setar o id da classificacao e da montadora. Portanto, a solução foi apenas adicionar o

public void setId(Long id) { this.id = id; }
para as classes Classificacao e Montadora. Farei o mesmo para a classe Modelo pois ela estará relacionada com uma classe a ser criada Veiculo.

Criado 29 de maio de 2013
Ultima resposta 30 de mai. de 2013
Respostas 1
Participantes 1