2016-01-11 44 views
1

對於一個項目,我嘗試創建一個類,使用Hibernate從數據庫中獲取數據。Java - 製作對靜態方法的靜態引用

在這個類中,我還嘗試製作一個使用DAO從數據庫中提取數據的對象列表。但是,當我嘗試通過列表循環時,eclipse提醒我,我試圖對非靜態方法進行靜態引用。

我的印象是,如果您使用的是一個非靜態的對象(操作符op)實例,並且它不引用靜態方法,它可以工作。 爲什麼不能這樣工作,我該如何解決它?

讓我特別困惑的是,老師給出的示例代碼做了同樣的事情,但確實有效。

package Client.DAO; 

import java.util.List; 

import javax.persistence.EntityManager; 
import javax.persistence.EntityManagerFactory; 

public class mainTest { 

private static EntityManagerFactory entityManagerFactory; 

public static void main(String[] args) { 

    EntityManager em = null; 
    try { 
     entityManagerFactory = HibernateUtil.getEntityManagerFactory(); 
     em = entityManagerFactory.createEntityManager(); 
    } catch (Throwable ex) { 
     System.err.println("Failed to create sessionFactory object." + ex); 
     throw new ExceptionInInitializerError(ex); 
    } 

    operatorDAO dao = new operatorDAOImpl(em); 
    List<operator> operators = dao.findAll(); 
    for (operator op : operators) { 
     System.out.print("Id: " + operator.getID());// <-- This doesnt work 
     System.out.print(", First Name: " + operator.getName()); // <-- This doesnt work 

    } 
} 
} 

作爲參考,工作示例代碼。警告:長

package nl.hu.ict; 

import java.util.List; 

import javax.persistence.EntityManager; 
import javax.persistence.EntityManagerFactory; 

import nl.hu.ict.dao.HibernateUtil; 
import nl.hu.ict.dao.LecturerDao; 
import nl.hu.ict.dao.LecturerDaoHibImpl; 
import nl.hu.ict.model.Lecturer; 

public class MyHibernateTest { 

private static EntityManagerFactory entityManagerFactory; 

public static void main(String[] args) { 
    // get the Hibernate - JPA entityManager 
    EntityManager em = null; 
    try { 
     entityManagerFactory = HibernateUtil.getEntityManagerFactory(); 
     em = entityManagerFactory.createEntityManager(); 
    } catch (Throwable ex) { 
     System.err.println("Failed to create sessionFactory object." + ex); 
     throw new ExceptionInInitializerError(ex); 
    } 

    // get the program (not necessary) 
    // MyHibernateTest test = new MyHibernateTest(); 

    LecturerDao lectDao = new LecturerDaoHibImpl(em); 
    Integer id; 

    // handle the database actions 

    // list all lecturers 
    List<Lecturer> lecturers = lectDao.findAll(); 
    for (Lecturer lecturer : lecturers) { 
     System.out.print("Id: " + lecturer.getID()); 
     System.out.print(", First Name: " + lecturer.getFirstName()); 
     System.out.println(", Last Name: " + lecturer.getLastName()); 
     System.out.println(", Last Name: " + lecturer.getLastName()); 
    } 

    // add an lecturer 
    Lecturer lect = new Lecturer(); 
    lect.setFirstName("Bill"); 
    lect.setLastName("Pianoman"); 
    lectDao.persist(lect); 
    // get the id of the added lecturer 
    id = lect.getID(); 
    // list to view changes 
    lecturers = lectDao.findAll(); 
    for (Lecturer lecturer : lecturers) { 
     System.out.print(lecturer); 
    } 

    // change a lecturer 
    // find find it again 
    lect = lectDao.findById(id); 
    // change it 
    lect.setFirstName("Billy"); 
    lectDao.update(lect); 
    // list to view changes 
    lecturers = lectDao.findAll(); 
    for (Lecturer lecturer : lecturers) { 
     System.out.print(lecturer); 
    } 

    // delete a lecturer 
    // find it again 
    lect = lectDao.findById(id); 
    // delete it 
    lectDao.delete(lect); 
    // list to view changes 
    lecturers = lectDao.findAll(); 
    for (Lecturer lecturer : lecturers) { 
     System.out.print(lecturer); 
    } 
    em.close(); 
    System.out.println("-- einde --"); 
} 
} 
+0

你能想出更簡單的例子嗎? – Andremoniy

+0

你沒有使用這個對象,你正在使用這個類。 operator.getID()應該是op.getID() –

回答

2

這是命名混淆;在這部分代碼:

operatorDAO dao = new operatorDAOImpl(em); 
List<operator> operators = dao.findAll(); 
for (operator op : operators) { 
    System.out.print("Id: " + operator.getID());// <-- This doesnt work 
    System.out.print(", First Name: " + operator.getName()); // <-- This doesnt work 
} 

你創建了運營商指從調用DAO的方法的findAll返回的列表中的局部變量。在for循環體中,你有一個局部變量op。局部變量op的類型是運算符。但是你使用「運算符」就好像它是變量的名稱一樣。將operator.getID()更改爲op.getID()。編譯器認爲你在​​運算符類上調用了一個實例方法getID,這就是爲什麼你得到「對非靜態方法的靜態引用」錯誤。

按照命名約定,可以最大限度地減少這些類型的錯誤。類型(類和接口)應該以大寫字母開頭。實例變量和局部變量應該以小寫字母開頭。繼慣例這段代碼就變成了:

OperatorDAO dao = new OperatorDAOImpl(em); 
List<Operator> operators = dao.findAll(); 
for (Operator operator : operators) { 
    System.out.print("Id: " + operator.getID()); 
    System.out.print(", First Name: " + operator.getName()); 
} 
+0

啊,你是對的。即時通訊使用操作符而不是操作,即時通訊一個白癡。感謝你的回答! – DyonBeumer

0

你可能想利用op而不是operator。後者是一個類名,你試圖在該類上調用非靜態的方法。

此外,Java語言具有非常好的習慣,這將有助於快速確定這個問題 - 類應以大寫開始,而以小寫變量

0
System.out.print("Id: " + operator.getID());// <-- This doesnt work 
System.out.print(", First Name: " + operator.getName()); // <-- This doesnt work 

應該是:

System.out.print("Id: " + op.getID());// <-- This doesnt work 
System.out.print(", First Name: " + op.getName()); // <-- This doesnt work 

您正在嘗試當需要實例化方法時,訪問getID和getName作爲靜態方法。