【问题标题】:Hibernate - SQLGrammarException: could not extract ResultSet on PersistHibernate - SQLGrammarException:无法在 Persist 上提取 ResultSet
【发布时间】:2016-02-17 03:54:17
【问题描述】:

我正在尝试持久化一个实体。当我使用本机查询向我的表中插入一行时,它可以正常工作,但是当我使用 EntityManager 持久方法插入实体时,我收到一个错误,抱怨查询好像它在语法上是错误的。

下面是我的实体类:

import javax.persistence.*;
import java.util.Date;

@Entity
public class Media {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    @Column(name = "media_location")
    private String mediaLocation;

    @Column(name = "media_location_url")
    private boolean fromUrl = false;

    @Column(name = "date")
    private Date uploadDate;

    @Column(name = "description")
    private String description;

    public Media() {

    }

    public Integer getId() {
        return id;
    }

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

    public String getMediaLocation() {
        return mediaLocation;
    }

    public void setMediaLocation(String mediaLocation) {
        this.mediaLocation = mediaLocation;
    }

    public boolean isFromUrl() {
        return fromUrl;
    }

    public void setFromUrl(boolean fromUrl) {
        this.fromUrl = fromUrl;
    }

    public Date getUploadDate() {
        return uploadDate;
    }

    public void setUploadDate(Date uploadDate) {
        this.uploadDate = uploadDate;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }
}

我的经理班如下:

@Stateless
public class UserManager {

    @EJB
    private BaseDao baseDao;

    public String createNewMedia_test() {

        Media media = new Media();
        media.setFromUrl(false);
        media.setDescription("adsddfsd");
        media.setMediaLocation("here");
        media.setUploadDate(new Date());

        baseDao.saveMedia(media);

        return "OK";

    }
}

BaseDao 如下:

@Stateless
public class BaseDao {
    @PersistenceContext(unitName="MySqlDS")
    private EntityManager entityManager;

    public void saveMedia(Media media) {

        entityManager.persist(media);
    }
}

但是在持久调用时我得到了错误,在我的本地主机 web ui 中,我看到堆栈跟踪以

开头
Query String:null
Stack Trace
javax.ejb.EJBException: javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not extract ResultSet

【问题讨论】:

  • 能否将Hibernate属性hibernate.show_sql设置为true,然后查看正在执行的查询。
  • 我应该在哪里指定这个?
  • 在您的 persistence.xml 配置文件中,请参阅 docs.jboss.org/hibernate/entitymanager/3.5/reference/en/html/…
  • 我现在可以看到查询了。但是在执行持久化时,consol 中打印的都是 Hibernate:调用 hibernate_sequence 的下一个值,然后出现错误和堆栈跟踪。

标签: java mysql hibernate jpa


【解决方案1】:

我相信您需要在 Hibernate 事务中调用persist()。尝试将您对 persist() 的调用包装在事务中,如下面的代码 sn-p 所示:

@Stateless
public class BaseDao {
    @PersistenceContext(unitName="MySqlDS")
    private EntityManager entityManager;

    public void saveMedia(Media media) {

        entityManager.getTransaction().begin();
        entityManager.persist(media);
        entityManager.getTransaction().commit();
    }
}

【讨论】:

    猜你喜欢
    • 2017-11-22
    • 2015-05-27
    • 2016-05-06
    • 2014-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多