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;
...