[RESOLVIDO] Hibernate : relacionar apenas para obter dados

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:

[code]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();
}

}
[/code]
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;
...

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.