2014-03-03 24 views
1

我正在嘗試學習JPA。如果我寫一個,然後在關閉之前立即閱讀,它就會起作用。但是,如果我嘗試自己閱讀,它不會。這裏是我的用戶代碼:JPA的新手 - 可以編寫,但無法從數據庫讀取

@Entity 
@Table(name = "JPA_Users") 
public class User { 

    @Id @GeneratedValue 
    @Column(name = "user_id") 
    private int id; 

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

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

    public User(){} 

    public User(String username, String password){ 
     this.username = username; 
     this.password = password; 
    } 

    public int getId() { 
     return id; 
    } 

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

    public String getUsername() { 
     return username; 
    } 

    public void setUsername(String username) { 
     this.username = username; 
    } 

    public String getPassword() { 
     return password; 
    } 

    public void setPassword(String password) { 
     this.password = password; 
    } 

    @Override 
    public String toString(){ 
     return Integer.toString(id) + ":" + username + ":" + password; 
    } 
} 

這裏是JPA代碼:

public void write(){ 
    EntityManagerFactory emf = Persistence.createEntityManagerFactory("helloworld"); 

    EntityManager em = emf.createEntityManager(); 
    EntityTransaction et = em.getTransaction(); 
    et.begin(); 

    User user = new User("Chris", "123456"); 
    User user2 = new User("Dave", "password"); 
    User user3 = new User("Peter", "asfdfsdf"); 
    em.persist(user); 
    em.persist(user2); 
    em.persist(user3); 
    em.flush(); 

    List users = em.createQuery("SELECT u FROM User u").getResultList(); 
    System.out.println(users.size() + " user(s) found"); 
    for(Object o : users){ 
     User u = (User) o; 
     System.out.println(u.getId()); 
     System.out.println(u.getUsername()); 
     System.out.println(u.getPassword()); 
     System.out.println("--------------------------"); 
    } 

    et.commit(); 
    em.close();  
    emf.close(); 
} 

上述工作,並打印出用戶的詳細信息。但如果我自己運行下面的方法,它不起作用。它打印出「找到0個用戶」。我已經在SQL Developer中檢查過,看看這個表是否在那裏並且已經填充了,它是。

public void read(){ 
    EntityManagerFactory emf = Persistence.createEntityManagerFactory("helloworld"); 
    EntityManager em = emf.createEntityManager(); 
    List users = em.createQuery("SELECT u FROM User u").getResultList(); 
    System.out.println(users.size() + " user(s) found"); 
    for(Object o : users){ 
     User u = (User) o; 
     System.out.println(u.getId()); 
     System.out.println(u.getUsername()); 
     System.out.println(u.getPassword()); 
     System.out.println("--------------------------"); 
    } 
    em.close(); 
    emf.close(); 
} 

這在它自己也不起作用:

public void read(){ 
    EntityManagerFactory emf = Persistence.createEntityManagerFactory("helloworld"); 
    EntityManager em = emf.createEntityManager(); 
    User u = em.find(User.class, 1); 
    System.out.println(u); 
    em.close(); 
    emf.close(); 
} 

最後,這裏是persistence.xml中。我不瞭解下面的大部分內容,所以我想這個問題與這裏的內容有關。謝謝,我感謝任何幫助。

<persistence 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_1_0.xsd" 
    version="1.0"> 
    <persistence-unit name="helloworld"> 
    <properties> 
     <!-- Scan for annotated classes and Hibernate mapping XML files --> 
     <property name="hibernate.archive.autodetection" value="class, hbm" /> 

     <!-- SQL stdout logging --> 
     <property name="hibernate.show_sql" value="true" /> 
     <property name="hibernate.format_sql" value="true" /> 
     <property name="use_sql_comments" value="true" /> 
     <property name="hibernate.dialect" value="org.hibernate.dialect.OracleDialect" /> 
     <property name="hibernate.connection.driver_class" value="oracle.jdbc.driver.OracleDriver" /> 
     <property name="hibernate.connection.url" 
      value="jdbc:My_Database_location" /> 
     <property name="hibernate.connection.username" value="My_Username" /> 
     <property name="hibernate.connection.password" value="My_Password"/> 

     <property name="hibernate.hbm2ddl.auto" value="create" /> 
     <property name="hibernate.c3p0.min_size" value="2" /> 
     <property name="hibernate.c3p0.max_size" value="30" /> 
     <property name="hibernate.c3p0.timeout" value="300" /> 
     <property name="hibernate.c3p0.max_statements" value="50" /> 
     <property name="hibernate.c3p0.idle_test_period" value="3000" /> 
    </properties> 
</persistence-unit> 

回答

1
User u = em.find(User.class, 1); 

,你是100%肯定,有事實上的實體與ID = 1就在您的用戶表?...

+0

是的,正確的。我有用戶ID 1,2和3. 另外:如果我再次運行寫入方法,它不會再添加三行。我還剩三個。 – Chris

+0

這很奇怪,因爲如果你再次堅持操作,它應該添加新用戶。你確定你正在檢查你在你的休眠cfg中的數據庫嗎? – Antoniossss

+0

是的,數據庫是一樣的。我只能在工作中訪問這個數據庫。 我正在使用的Persistence.xml被複制並粘貼,唯一改變的是數據庫地址,用戶名和密碼。 – Chris

0

最後的評論已經修好了,改變「創造」到「驗證」,非常感謝。 :)

我正要張貼:

我擺脫了@GeneratedValue和添加的ID爲1,2和3自己。然後我再次用ID 4,5和6再次運行它。在我的數據庫中,我有ID 4,5和6 - 1,2和3剛剛消失。

更改創建以驗證已解決此問題,以及閱讀問題。再一次,謝謝!我不明白什麼是創建和驗證。我現在有一個谷歌。

1

EntityManagerFactory實例是重量級對象。它只應該創建一次。您應該創建一個單例,而不是在每個讀/寫中創建一個新單例,至少您只是在應用程序生命週期中執行該操作。檢查該用戶發佈作爲示例第一個代碼,你可以複製並粘貼:

When should EMF instances be created and closed

+0

我知道我上面所做的是不好的練習,計劃稍後重構,可能是因爲它在構造函數中。但是,這看起來更好的解決方案,謝謝。 – Chris