所以我正在使用带有注释的 hibernate 创建一个简单的 Hello World。
//hibernate.cfg.xml
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- Database connection settings -->
<property name="connection.driver_class">net.sourceforge.jtds.jdbc.Driver</property>
<!-- <property name="connection.url">jdbc:jtds:sqlserver://127.0.0.1:1433/ProgAp3_B</property> -->
<property name="connection.url">jdbc:jtds:sqlserver://localhost:1433/ProgAp3_B</property>
<property name="connection.username">username</property>
<property name="connection.password">password</property>
<!-- JDBC connection pool (use the built-in) -->
<property name="connection.pool_size">1</property>
<!-- SQL dialect -->
<property name="dialect">org.hibernate.dialect.SQLServer2008Dialect</property>
<!-- Disable the second-level cache -->
<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
<!-- Echo all executed SQL to stdout -->
<property name="show_sql">true</property>
<!-- Drop and re-create the database schema on startup -->
<property name="hbm2ddl.auto">create</property>
<!-- Names the annotated entity class -->
<mapping class="com.Message"/>
</session-factory>
</hibernate-configuration>
Message.java
package com;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
@Entity (name="Messages")
public class Message {
@Id @GeneratedValue
private Long id;
private String text;
@ManyToOne (cascade = CascadeType.ALL)
private Message nextMessage;
public Message() { }
public Message(String text) {
this.text = text;
}
//geters and setters
}
HelloWorld.java
package com;
import java.util.*;
import org.hibernate.*;
import org.hibernate.cfg.Configuration;
public class HelloWorld {
public static void main(String[] args) {
Session session = new Configuration().configure().buildSessionFactory().openSession();
Transaction tx = session.beginTransaction();
Message message = new Message("Hello world");
session.save(message);
tx.commit();
Transaction newTransaction = session.beginTransaction();
List<Message> messages = session.createQuery("from Message m order by m.text asc").list();
System.out.println( messages.size() + " message(s) found:" );
for (Iterator<Message> iterator = messages.iterator(); iterator.hasNext();) {
Message loaded = iterator.next();
System.out.println(loaded.getText());
}
newTransaction.commit();
session.close();
}
}
除了第二笔交易外,一切正常。
Exception in thread "main" org.hibernate.hql.ast.QuerySyntaxException: Message is not mapped [from Message m order by m.text asc]
由于 HQL 是面向对象的,所以我使用了 Message,因为它是我想要映射的类。为什么消息对象没有被映射? HQL 出了什么问题?
最佳答案
让我们讨论一下@Entity
和@Table
例如,我可以使用相同的名称属性值
@Entity(name = "someThing")
@Table(name = "someThing")
对于同一类我也可以有不同的名称
@Entity(name = "someThing")
@Table(name = "otherThing")
@Entity(name = "someThing") => this name will be used to name Entity
@Table(name = "someThing") => this name will be used to name a table in DB
因此,在第一种情况下,您的表和实体将具有相同的名称,这将允许您在编写 HQL
或 JPQL
时访问与实体相同名称的表。
在第二种情况下,在编写查询时,您必须使用 @Entity 中给出的名称,并且 @Table 中给出的名称将用于命名数据库中的表。
因此,在 HQL 中,您的 someThing 将引用数据库中的 otherThing
查询应该类似于:from Messages m order by m.text asc
关于java - 语法查询异常,对象无法映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25337075/