簡體   English   中英

向數據庫添加多個實例

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM