Erro com hibernate?

8 respostas Resolvido
javahibernateerror
D
org.hibernate.PersistentObjectException: detached entity passed to persist: com.ambra.report.models.TemporaryMachineId
at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:139)
	at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:75)
	at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:807)
	at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:780)
	at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:785)
	at org.hibernate.jpa.spi.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:1181)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)

Classe

@Entity
public class TemporaryMachineId {
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private int id;
	private int machineId;
	private int tag;

	public int getTag() {
		return tag;
	}

	public void setTag(int tag) {
		this.tag = tag;
	}

	public int getId() {
		return id;
	}

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

	public int getMachineId() {
		return machineId;
	}

Transactional

O que pode ser?

8 Respostas

I

Vc conhece os estados ?
Managed
Detached
Transient

E

Esse link pode te auxiliar.

link

Abraço

D

não, isso é um estado? no curso do alura de hibernate tem isso?

D

todo model eu preciso criar um construtor para que ele possa funcionar?

I

Entende sobre o ciclo de vida do JPA: http://www.arquiteturacomputacional.eti.br/2013/02/entenda-o-ciclo-de-vida-das-entidades.html

D

entao pode ser 3 coisas?

Entidade com id
entidade nao gerenciada pelo entitymanager
entidade pode ou nao existir no banco de dados.

a entidade pode ou nao existir no banco de dados impossivel, pois nao tem nada la.

a entidade nao gerenciada pelo entitymanager vou postar o meu codigo aqui

model

@Entity public class TemporaryMachineId { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; private int machineId; private int tag;
JPACnfiguration

`@EnableTransactionManagement
public class JPAConfiguration {

@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
	LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean();

	JpaVendorAdapter jpaVendorAdapter = new HibernateJpaVendorAdapter();

	factoryBean.setJpaVendorAdapter(jpaVendorAdapter);

	DriverManagerDataSource dataSource = new DriverManagerDataSource();
	dataSource.setUsername("root");
	dataSource.setPassword("");
	dataSource.setUrl("jdbc:mysql://localhost:3306/testeHibernate");
	dataSource.setDriverClassName("com.mysql.jdbc.Driver");

	factoryBean.setDataSource(dataSource);

	Properties props = new Properties();
	props.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");
	props.setProperty("hibernate.show_sql", "true");
	props.setProperty("hibernate.hbm2ddl.auto", "update");

	factoryBean.setJpaProperties(props);

	factoryBean.setPackagesToScan("com.ambra.report.models");

	return factoryBean;

}

@Bean
public JpaTransactionManager transactionManager(EntityManagerFactory emf) {
    return new JpaTransactionManager(emf);
}

}`

Dao

`@Repository
@Transactional
public class TemporaryMachineIdDao {

@PersistenceContext
private EntityManager manager;

public void gravar(TemporaryMachineId tempMachine){
	manager.persist(tempMachine);
}

}`

servlet spring

`public class ServletSpringMvc extends AbstractAnnotationConfigDispatcherServletInitializer{

@Override
protected Class<?>[] getRootConfigClasses() {
	// TODO Auto-generated method stub
	return null;
}

@Override
protected Class<?>[] getServletConfigClasses() {
	// TODO Auto-generated method stub
	return new Class[] { AppWebConfiguration.class,JPAConfiguration.class};
}

@Override
protected String[] getServletMappings() {
	// TODO Auto-generated method stub
	return new String[] {"/"};
}

}`
app web

`@EnableWebMvc

@ComponentScan(basePackageClasses={HomeController.class,RelatorioController.class,TemporaryMachineIdDao.class})

public class AppWebConfiguration extends WebMvcConfigurerAdapter{

<a class="mention" href="/u/bean">@Bean</a>

public InternalResourceViewResolver internalResourceViewResolve() {

InternalResourceViewResolver resolve = new InternalResourceViewResolver();

resolve.setPrefix("/WEB-INF/views/");

resolve.setSuffix(".jsp");

return resolve;

}
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
	configurer.enable();
}

}`

talvez seja onde estou gravando. aqui esta o codigo do controller

`	@RequestMapping(value = /report/relatorio, method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)

public String form(@RequestParam(id[]”) int id[],

@RequestParam(dateIni) @DateTimeFormat(pattern = dd/MM/yyyy) Date dateIni,

@RequestParam(dateFim) @DateTimeFormat(pattern = dd/MM/yyyy) Date dateFim,

@RequestParam(horaInit) String horaInit, @RequestParam(minutoInit) String minutoInit,

@RequestParam(horaFim) String horaFim, @RequestParam(minutoFim) String minutoFim) {
Calendar cal = Calendar.getInstance();

	Relatorio relatorio = new Relatorio();
	
	relatorio.setTag((int) cal.getTimeInMillis());
	relatorio.setMachinesIds(id);
	relatorio.setDateIni(dateIni);
	relatorio.setDateFim(dateFim);
	relatorio.setHoraInit(horaInit);
	relatorio.setMinutoInit(minutoInit);
	relatorio.setHoraFim(horaFim);
	relatorio.setMinutoFim(minutoFim);
	
	System.out.println(relatorio.toString());
	
	for (int i = 0; i < relatorio.getMachinesIds().length; i++) {
		TemporaryMachineId tempMachine = new TemporaryMachineId();
		
		tempMachine.setId(relatorio.getMachinesIds()[i]);
		tempMachine.setTag(relatorio.getTag());
		
		tempMachineDao.gravar(tempMachine);
	}
	
	return "/relatorio/ok";
}`

agora com a entidade com id… nao sei, Precisa ter id? eu coloquei pro hibernate cuidar disso. nao precisaria mandar na hora do insert correto?

D
Solucao aceita

ACHEI!

tempMachine.setMachineId(relatorio.getMachinesIds()[i]);

antes era

tempMachine.setId(relatorio.getMachinesIds()[i]);

eu estava inserindo um Id. não era a intenção mas era isso que estava acontencendo. obrigado pela ajuda!

E

Não, somente se você não definir o id como automático, Observe que nessa linha //@GeneratedValue(strategy = GenerationType.AUTO) ela estar comentada, caso você queria que o hibernate tenha a responsabilidade de gerar o id automaticamente, pode retirar o comentário e o construtor com o parâmetro id .

Criado 28 de julho de 2016
Ultima resposta 29 de jul. de 2016
Respostas 8
Participantes 4