【问题标题】:EJB and Hibernate: Table dosen't existEJB 和 Hibernate:表不存在
【发布时间】:2016-07-12 16:55:42
【问题描述】:

我正在开发这个应用程序,我需要从 MySql 数据库中获取结果列表,但是每次我在服务器上运行它时(wildfly 9)我都会收到一个错误,表明该表不存在。这里是代码在我的 EJB 中:

@Stateless
@LocalBean
public class MessageService {

    @PersistenceContext(unitName="primary")
    EntityManager em;

    @SuppressWarnings("unused")
    public List<Message> customers = new ArrayList<Message>();

    public List<Message> findAll() {
        customers= em.createQuery("select c from Message c").getResultList();
        //customers = query.getResultList();
        System.out.println(customers.size());
        return customers;
   }

这是我的实体:

@Entity
@NamedQuery(name="Message.findAll", query="SELECT m FROM Message m")
public class Message implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    private int idMessage;

    private String discriminateur;

    private int numFenetre;

    private String texte;

这是我的 persistence.xml:

  <persistence version="2.0"
   xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="
        http://java.sun.com/xml/ns/persistence
        http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
   <persistence-unit name="primary">
      <!-- If you are running in a production environment, add a managed 
         data source, this example data source is just for development and testing! -->
      <!-- The datasource is deployed as <EAR>/META-INF/MavenEar-ds.xml, you
         can find it in the source at ear/src/main/application/META-INF/MavenEar-ds.xml -->
      <jta-data-source>java:/mysql</jta-data-source>
      <class>com.model.entities.Message</class>
      <properties>
         <!-- Properties for Hibernate -->
         <!--  <property name="hibernate.hbm2ddl.auto" value="create-drop" />-->
         <property name="hibernate.show_sql" value="false" />
      </properties>
   </persistence-unit>
</persistence>

PS:我确实设置了一个链接到数据库的数据源。

Caused by: org.hibernate.exception.SQLGrammarException: could not extract ResultSet
    at org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:123)
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:126)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:112)
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:91)
    at org.hibernate.loader.Loader.getResultSet(Loader.java:2066)
    at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1863)
    at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1839)
    at org.hibernate.loader.Loader.doQuery(Loader.java:910)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:355)
    at org.hibernate.loader.Loader.doList(Loader.java:2554)
    at org.hibernate.loader.Loader.doList(Loader.java:2540)
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2370)
    at org.hibernate.loader.Loader.list(Loader.java:2365)
    at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:497)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:387)
    at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:236)
    at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1300)
    at org.hibernate.internal.QueryImpl.list(QueryImpl.java:103)
    at org.hibernate.jpa.internal.QueryImpl.list(QueryImpl.java:573)
    at org.hibernate.jpa.internal.QueryImpl.getResultList(QueryImpl.java:449)
    ... 126 more
Caused by: com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: Table 'christina.message' doesn't exist
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:936)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2985)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1631)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1723)
    at com.mysql.jdbc.Connection.execSQL(Connection.java:3283)
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1332)
    at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1467)
    at org.jboss.jca.adapters.jdbc.WrappedPreparedStatement.executeQuery(WrappedPreparedStatement.java:504)
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:82)
    ... 142 more

【问题讨论】:

  • 你能显示错误吗?你确定表不存在吗?你确定它连接到正确的数据库吗?
  • 我确定该表存在,这是我的数据源中的 url 'jdbc:mysql://localhost:3306/christina' 它清楚地指向正确的数据库。我将添加堆栈跟踪
  • @Tiny 谢谢已经解决了问题。在答案下检查我的 cmets

标签: java mysql hibernate ejb-3.0


【解决方案1】:

尝试将以下内容添加到您的 persistence.xml

<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />

我认为它可能正在寻找 christina.christina.message。否则错误只会说找不到表“消息”。您的实体是如何注释的?您是否使用自定义命名策略或方言?

【讨论】:

  • 我添加了属性但仍然是同样的错误。我的实体上面有常规的@Entity 注释,就是这样
  • 我不知道。我仍然怀疑它试图访问错误的模式或其他东西。我通常打开 mysql 查询日志,这样我就可以看到所有查询命中它。这应该可以准确地告诉您它是否确实达到了正确的架构。
  • 哦,我的错,原来create-drop 在我发表评论之前就放弃了表格,所以我愚蠢地真的在寻找一个不存在的表格。我现在修好了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-01
  • 1970-01-01
  • 2015-08-20
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
相关资源
最近更新 更多