2014-03-26 44 views
0

您好我是Hibernate的新手。我正在嘗試一個示例程序,當我第二次執行代碼時,hibernate不會創建表並掛起。當我點擊數據庫表時,數據庫掛起。休眠不會創建表第二次並掛起

我使用postgresql-9.3.3-1版本和hibernate-release-4.3.4.Final。

以下是我的代碼片段

1.hibernate.cfg.xml

<session-factory> 

    <property name="connection.driver_class">org.postgresql.Driver</property> 
    <property name="connection.url">jdbc:postgresql://localhost:5432/hibernatedb</property> 
    <property name="connection.username">postgres</property> 
    <property name="connection.password">postgres</property> 

    <!-- JDBC connection pool (use the built-in) --> 
    <property name="connection.pool_size">1</property> 

    <!-- SQL dialect --> 
    <property name="dialect">org.hibernate.dialect.PostgreSQL9Dialect</property> 

    <!-- Enable Hibernate's automatic session context management --> 
    <property name="current_session_context_class">thread</property> 

    <!-- Echo all executed SQL to stdout --> 
    <property name="show_sql">true</property> 
    <property name="hbm2ddl.auto">create</property> 

    <mapping class="com.pramati.dto.UserDetails"></mapping> 

</session-factory> 

2.My POJO類。我使用的標註在我的POJO類

UserDetails.java

@Entity 
@Table (name="USER_DETAILS") 
public class UserDetails { 

@Id 
private int userId; 
private String userName; 
@Temporal (TemporalType.DATE) 
private Date joinDate; 
private String address; 
private String description; 

public int getUserId() { 
    return userId; 
} 
public void setUserId(int userId) { 
    this.userId = userId; 
} 
public String getUserName() { 
    return userName; 
} 
public void setUserName(String userName) { 
    this.userName = userName; 
} 
public Date getJoinDate() { 
    return joinDate; 
} 
public void setJoinDate(Date joinDate) { 
    this.joinDate = joinDate; 
} 
public String getAddress() { 
    return address; 
} 
public void setAddress(String address) { 
    this.address = address; 
} 
public String getDescription() { 
    return description; 
} 
public void setDescription(String description) { 
    this.description = description; 
} 

}

    與主方法

我創建一個UserDetails對象和檢索

  • 我的Java類來自新創建的UserDetails對象的用戶名。以下是MJ Java代碼

    公共類HibernateTest {

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
    
        UserDetails userDetails = new UserDetails(); 
        userDetails.setUserId(1); 
        userDetails.setUserName("Avinash"); 
        userDetails.setAddress("Rajeev Nagar"); 
        userDetails.setJoinDate(new Date()); 
        userDetails.setDescription("Software Engineer"); 
    
        SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory(); 
        Session session = sessionFactory.openSession(); 
        session.beginTransaction(); 
        session.save(userDetails); 
        session.getTransaction().commit(); 
        session.close(); 
    
        userDetails=null; 
        session = sessionFactory.openSession(); 
        session.beginTransaction(); 
        userDetails = (UserDetails)session.get(UserDetails.class, 1); 
        System.out.println("User Name Retrieved is " + userDetails.getUserName()); 
        session.close(); 
    } 
    

    }

    首次當我運行按照上述java類是Eclipse的控制檯上顯示的輸出,並且它創建的UserDetails對象

    Mar 26, 2014 3:49:06 PM org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit> 
          INFO: HCANN000001: Hibernate Commons Annotations {4.0.4.Final} 
          Mar 26, 2014 3:49:06 PM org.hibernate.Version logVersion 
          INFO: HHH000412: Hibernate Core {4.3.4.Final} 
          Mar 26, 2014 3:49:06 PM org.hibernate.cfg.Environment <clinit> 
          INFO: HHH000206: hibernate.properties not found 
          Mar 26, 2014 3:49:06 PM org.hibernate.cfg.Environment buildBytecodeProvider 
          INFO: HHH000021: Bytecode provider name : javassist 
          Mar 26, 2014 3:49:06 PM org.hibernate.cfg.Configuration configure 
          INFO: HHH000043: Configuring from resource: /hibernate.cfg.xml 
          Mar 26, 2014 3:49:06 PM org.hibernate.cfg.Configuration getConfigurationInputStream 
          INFO: HHH000040: Configuration resource: /hibernate.cfg.xml 
          Mar 26, 2014 3:49:06 PM org.hibernate.internal.util.xml.DTDEntityResolver resolveEntity 
          WARN: HHH000223: Recognized obsolete hibernate namespace http://hibernate.sourceforge.net/. Use namespace http://www.hibernate.org/dtd/ instead. Refer to Hibernate 3.6 Migration Guide! 
          Mar 26, 2014 3:49:06 PM org.hibernate.cfg.Configuration doConfigure 
          INFO: HHH000041: Configured SessionFactory: null 
          Mar 26, 2014 3:49:06 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure 
          WARN: HHH000402: Using Hibernate built-in connection pool (not for production use!) 
          Mar 26, 2014 3:49:06 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator 
          INFO: HHH000401: using driver [org.postgresql.Driver] at URL [jdbc:postgresql://localhost:5432/hibernatedb] 
          Mar 26, 2014 3:49:06 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator 
          INFO: HHH000046: Connection properties: {user=postgres, password=****} 
          Mar 26, 2014 3:49:06 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator 
          INFO: HHH000006: Autocommit mode: false 
          Mar 26, 2014 3:49:06 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure 
          INFO: HHH000115: Hibernate connection pool size: 1 (min=1) 
          Mar 26, 2014 3:49:06 PM org.hibernate.dialect.Dialect <init> 
          INFO: HHH000400: Using dialect: org.hibernate.dialect.PostgreSQL9Dialect 
          Mar 26, 2014 3:49:06 PM org.hibernate.engine.jdbc.internal.LobCreatorBuilder useContextualLobCreation 
          INFO: HHH000424: Disabling contextual LOB creation as createClob() method threw error : java.lang.reflect.InvocationTargetException 
          Mar 26, 2014 3:49:06 PM org.hibernate.engine.transaction.internal.TransactionFactoryInitiator initiateService 
          INFO: HHH000399: Using default transaction strategy (direct JDBC transactions) 
          Mar 26, 2014 3:49:06 PM org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory <init> 
          INFO: HHH000397: Using ASTQueryTranslatorFactory 
          Mar 26, 2014 3:49:07 PM org.hibernate.tool.hbm2ddl.SchemaExport execute 
          INFO: HHH000227: Running hbm2ddl schema export 
          Hibernate: drop table USER_DETAILS cascade 
          Hibernate: create table USER_DETAILS (userId int4 not null, address varchar(255), description varchar(255), joinDate date, userName varchar(255), primary key (userId)) 
          Mar 26, 2014 3:49:07 PM org.hibernate.tool.hbm2ddl.SchemaExport execute 
          INFO: HHH000230: Schema export complete 
          Hibernate: insert into USER_DETAILS (address, description, joinDate, userName, userId) values (?, ?, ?, ?, ?) 
          Hibernate: select userdetail0_.userId as userId1_0_0_, userdetail0_.address as address2_0_0_, userdetail0_.description as descript3_0_0_, userdetail0_.joinDate as joinDate4_0_0_, userdetail0_.userName as userName5_0_0_ from USER_DETAILS userdetail0_ where userdetail0_.userId=? 
          User Name Retrieved is Avinash 
    

    第二次運行上面的代碼時,hibernate不會創建表。以下是它得到的線說:「刪除表USER_DETAILS級聯」 請不要建議或幫助我的問題後,卡在第二次運行

    Mar 26, 2014 3:50:52 PM org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit> 
        INFO: HCANN000001: Hibernate Commons Annotations {4.0.4.Final} 
        Mar 26, 2014 3:50:52 PM org.hibernate.Version logVersion 
        INFO: HHH000412: Hibernate Core {4.3.4.Final} 
        Mar 26, 2014 3:50:52 PM org.hibernate.cfg.Environment <clinit> 
        INFO: HHH000206: hibernate.properties not found 
        Mar 26, 2014 3:50:52 PM org.hibernate.cfg.Environment buildBytecodeProvider 
        INFO: HHH000021: Bytecode provider name : javassist 
        Mar 26, 2014 3:50:52 PM org.hibernate.cfg.Configuration configure 
        INFO: HHH000043: Configuring from resource: /hibernate.cfg.xml 
        Mar 26, 2014 3:50:52 PM org.hibernate.cfg.Configuration getConfigurationInputStream 
        INFO: HHH000040: Configuration resource: /hibernate.cfg.xml 
        Mar 26, 2014 3:50:52 PM org.hibernate.internal.util.xml.DTDEntityResolver resolveEntity 
        WARN: HHH000223: Recognized obsolete hibernate namespace http://hibernate.sourceforge.net/. Use namespace http://www.hibernate.org/dtd/ instead. Refer to Hibernate 3.6 Migration Guide! 
        Mar 26, 2014 3:50:52 PM org.hibernate.cfg.Configuration doConfigure 
        INFO: HHH000041: Configured SessionFactory: null 
        Mar 26, 2014 3:50:52 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure 
        WARN: HHH000402: Using Hibernate built-in connection pool (not for production use!) 
        Mar 26, 2014 3:50:52 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator 
        INFO: HHH000401: using driver [org.postgresql.Driver] at URL [jdbc:postgresql://localhost:5432/hibernatedb] 
        Mar 26, 2014 3:50:52 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator 
        INFO: HHH000046: Connection properties: {user=postgres, password=****} 
        Mar 26, 2014 3:50:52 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator 
        INFO: HHH000006: Autocommit mode: false 
        Mar 26, 2014 3:50:52 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure 
        INFO: HHH000115: Hibernate connection pool size: 1 (min=1) 
        Mar 26, 2014 3:50:52 PM org.hibernate.dialect.Dialect <init> 
        INFO: HHH000400: Using dialect: org.hibernate.dialect.PostgreSQL9Dialect 
        Mar 26, 2014 3:50:52 PM org.hibernate.engine.jdbc.internal.LobCreatorBuilder useContextualLobCreation 
        INFO: HHH000424: Disabling contextual LOB creation as createClob() method threw error : java.lang.reflect.InvocationTargetException 
        Mar 26, 2014 3:50:52 PM org.hibernate.engine.transaction.internal.TransactionFactoryInitiator initiateService 
        INFO: HHH000399: Using default transaction strategy (direct JDBC transactions) 
        Mar 26, 2014 3:50:52 PM org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory <init> 
        INFO: HHH000397: Using ASTQueryTranslatorFactory 
        Mar 26, 2014 3:50:52 PM org.hibernate.tool.hbm2ddl.SchemaExport execute 
        INFO: HHH000227: Running hbm2ddl schema export 
        Hibernate: drop table USER_DETAILS cascade 
    

    的輸出。提前致謝

  • 回答

    0

    不要自己設置ID。 由於您目前將ID硬編碼爲1,第二次會失敗。

    以下代碼將自動生成ID。

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "ID") 
    private Long id; 
    
    0

    根據你的代碼首先讓我知道: -

    包括Checkpoint你想創建一個表,或者您正試圖插入記錄的表,因爲檢查代碼後,我可以說你將記錄插入表格中。

    休眠插入: -

    1. 當你試圖插入使用 任何表中的任何記錄冬眠主鍵唯一指定由您記錄本身 冬眠。 (您不必擔心 備案uniquer ID)
    2. 在你的代碼的正確定義實體,而是在實體(表)的主鍵
    沒有指定 自動遞增

    您的代碼: -

    @Entity 
    @Table (name="USER_DETAILS") 
    public class UserDetails { 
    
    @Id 
    private int userId; 
    

    應該糾正,以(使Hibernate會自己處理與獨特的鑰匙插入): -

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "ID") 
    private Long id; 
    
    在你的代碼

    三錯點是要指定自己的主鍵,這也是錯誤的 -

    UserDetails userDetails = new UserDetails(); 
    userDetails.setUserId(1); 
    

    讓我們知道,如果你有futher查詢或疑問。

    +0

    感謝您的回答。我已經按照您的建議進行了更改。但它仍然不起作用。當我在eclipse中運行這段代碼時,我發現代碼沒有終止。做了一些谷歌碰到這個鏈接(http://stackoverflow.com/questions/22303032/upgrade-to-hibernate-4-3-4-main-method-never-terminates-jvm-not-finish)。這是我面臨的同樣的問題 –

    +0

    好吧..你可以做一件事情.....只有perfrom插入第一,並reomve userDetails =(UserDetails)session.get(UserDetails.class,1)的邏輯;因爲一旦你把@GeneratedValue(strategy = GenerationType.AUTO)hibernate不會生成1作爲實體的主鍵......所以試着只運行插入邏輯並讓我知道結果 –

    2

    嘗試在您的主要方法結束時關閉sessionFactory。

    public static void main(String[] args) { 
    
    UserDetails userDetails = new UserDetails(); 
    userDetails.setUserId(1); 
    userDetails.setUserName("Avinash"); 
    userDetails.setAddress("Rajeev Nagar"); 
    userDetails.setJoinDate(new Date()); 
    userDetails.setDescription("Software Engineer"); 
    
    SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory(); 
    Session session = sessionFactory.openSession(); 
    session.beginTransaction(); 
    session.save(userDetails); 
    session.getTransaction().commit(); 
    session.close(); 
    
    userDetails=null; 
    session = sessionFactory.openSession(); 
    session.beginTransaction(); 
    userDetails = (UserDetails)session.get(UserDetails.class, 1); 
    System.out.println("User Name Retrieved is " + userDetails.getUserName()); 
    session.close(); 
    sessionFactory.close(); 
    } 
    
    0

    幹得好,問題是缺少的行隨後

    session.getSessionFactory().close(); 
    

    我有同樣的問題。它已經固定;)

    0

    今天我有同樣的問題。這是我在我的主要方法做:

     Configuration configuration = new Configuration(); 
         configuration.configure(); 
         final ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(
          configuration.getProperties()).build(); 
         SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry); 
         Session session = sessionFactory.openSession(); 
         session.beginTransaction(); 
         ... 
         ... 
         session.close(); 
         session.getSessionFactory().close(); 
         StandardServiceRegistryBuilder.destroy(serviceRegistry); 
    

    我還檢查我的進程列表,有沒有在我以前的運行背景仍在運行的Java進程。結束這些正在運行的進程後,再次運行正常。