[英]Adding more than one instance to database
我有一個簡單的JSF + Hibernate + Spring + Mysql Java應用程序,我在Tomcat7上運行它。在JSF視圖頁面上,它只有一個添加按鈕,可以通過單擊它來將實例添加到數據庫中。添加第一個時它可以完美運行實例。但是,當我嘗試在同一會話中添加另一個實例時,該程序失敗,並出現以下錯誤:
An Error Occurred:
org.hibernate.PersistentObjectException: detached entity passed to persist: com.springhibernatejsf.model.Person
搜尋此錯誤后,我發現這可能是由於@GeneratedValue(strategy=GenerationType.IDENTITY)
而不是模式類中的@GeneratedValue(strategy=GenerationType.AUTO)
,或者是使用session.persist()
代替了session.merge()
在DAO實施類中。但是,它們都不對我有用。
Person.java:
package com.springhibernatejsf.model;
import java.io.Serializable;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
/**
* Entity bean with JPA annotations
*
*
*/
@Entity
@Table(name="Person")
@ManagedBean(name="person")
@SessionScoped
public class Person implements Serializable{
@Id
@Column(name="id")
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
private String name;
private String country;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
}
PersonDAOImpl.java:
package com.springhibernatejsf.dao;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Repository;
import com.springhibernatejsf.model.Person;
@Repository
public class PersonDAOImpl implements PersonDAO {
private SessionFactory sessionFactory;
private static final Logger logger = LoggerFactory.getLogger(PersonDAOImpl.class);
public void setSessionFactory(SessionFactory sf){
this.sessionFactory = sf;
}
@Override
public void addPerson(Person p){
Session session = this.sessionFactory.getCurrentSession();
session.persist(p);
session.flush();
logger.info("Addition is successful!");
}
@SuppressWarnings("unchecked")
@Override
public List<Person> listPersons() {
Session session = this.sessionFactory.getCurrentSession();
List<Person> personsList = session.createQuery("from Person").list();
for(Person p : personsList){
}
return personsList;
}
}
為什么會發生這種情況?
嘗試在PersonDaoImpl
使用以下代碼執行addPerson()
public void addPerson(Person p){
Session session = this.sessionFactory.getCurrentSession();
Transaction transaction=session.beginTransaction();
session.persist(p);
session.flush();
logger.info("Addition is successful!");
transaction.commit();
}
問題是persist()
必須在transaction
邊界內使用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.