我目前正在開發一個JavaFX應用程序,並且我正在使用sqlite-jdbc-3.8.11.2連接器的SQLLite數據庫,加上我的ORM模型,我選擇了最新的Hibernate分配。我得到的問題是我無法執行由我寫的查詢,儘管我成功地從數據庫中設置了插入,讀取,更新和刪除操作,但如果不使用Hibernate的默認操作,我無法做到這一點。 這些都是在hibernate.cfg.xml文件我的配置設置:用於Hibernate的SQLLite方言,表未映射的錯誤
<!-- JDBC Database Connection Settings-->
<property name="connection.driver_class">org.sqlite.JDBC</property>
<property name="connection.url">jdbc:sqlite:database.db</property>
<!-- JDBC Connection Pool Settings-->
<property name="connection.pool_size">1</property>
<!-- Selecting SQL Dialect-->
<property name="hibernate.dialect">org.hibernate.dialect.HSQLDialect</property>
<!-- Echo the SQL to stdout-->
<property name="show_sql">true</property>
<!-- Set the current session context -->
<property name="current_session_context_class">thread</property>
正如你所看到的,我使用的是HSQL方言此數據庫,這是因爲我無法找到在一個SQLite方言包由Hibernate框架提供。然而,正如我之前所說,它以某種方式起作用。
所以我有一個名爲Program的類,它實際上是一個名爲Programs的數據庫中的表。這裏是程序在Java代碼中的定義:
public class Program {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "program_id")
protected int program_id;
@Column(name = "name")
protected String name;
@Column(name = "developer")
protected String developer;
@Column(name = "rating")
protected int rating;
@Column(name = "state")
protected int state;
@Column(name = "reservation_date")
protected String reservedDate;
@Column(name = "sent_date")
protected String sentDate;
public Program() {
}
public Program(String name, int state, LocalDate reservation_date) {
this.name = name;
this.state = state;
this.reservedDate = reservation_date.toString();
}
現在我有另一個名爲DatabaseConnector的類,它用於管理數據庫連接。下面是它的代碼:
public class DatabaseConnector {
private final SessionFactory sessionFactory;
public DatabaseConnector() {
sessionFactory = new Configuration()
.configure()
.addAnnotatedClass(Program.class)//adding table
.buildSessionFactory();
}
public Program getProgram(int id) {
Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
Program p = session.get(Program.class, id);//captures an object from the database
session.getTransaction().commit();
return program;
}
正如你所看到了上面有它完美的作品一getProgram()方法。
然而,當我嘗試執行我自己的查詢,基於Hibernate文檔,它應該是這樣的:
public Program getProgram(int id) {
Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
List<Program> p = session.createQuery("FROM Programs WHERE Programs.id="+id).list();//This should find an Program
session.getTransaction().commit();
return p.get(0);
}
這是錯誤的Hibernate顯示:
java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: Programs is not mapped [FROM Programs WHERE Programs.id=1]
我必須說這個錯誤不僅發生在SELECT操作上,而且我嘗試用我自己的個人查詢執行每一個操作。我相信這個錯誤與數據庫方言有關,但我不太確定。