2017-12-29 44 views
0

私はwindows7x64にPostgresバージョン10.1をインストールしました。私は1つのテーブル "dbuser"とカラム "user_id"と "username"を持つデータベース "postgres"を持っています。私はIntelijとMavenを使用しています。私はテーブルに行を挿入しようとするために休止状態からセッションを使用しています。セッションを挿入する代わりにセッションを休止するのはなぜですか?

App.java

package com.hibernateTest; 

import org.hibernate.Session; 

public class App { 
    public static void main(String[] args) { 
     Session session = HibernateUtil.getSessionFactory().openSession(); 
    session.beginTransaction(); 
    dbuser dbuser = new dbuser(); 
    dbuser.setUser_id(556); 
    dbuser.setUsername("waaagr");  
    session.save(dbuser); 
    //session.merge(dbuser);//my mistake---old code 
    session.getTransaction().commit(); 
    } 
} 

HibernateUtil.java

package com.hibernateTest; 

import org.hibernate.SessionFactory; 
import org.hibernate.cfg.AnnotationConfiguration; 
import org.hibernate.cfg.Configuration; 

public class HibernateUtil { 

    private static final SessionFactory sessionFactory = buildSessionFactory(); 

    private static SessionFactory buildSessionFactory() { 
     try { 
      return new Configuration().configure().buildSessionFactory(); 
     } catch (Throwable ex) { 
      throw new ExceptionInInitializerError(ex); 
     } 
    } 

    public static SessionFactory getSessionFactory() { 
     return sessionFactory; 
    } 

    public static void shutdown() { 
     getSessionFactory().close(); 
    } 

} 

dbuser.java:

package com.hibernateTest; 

import javax.persistence.*; 

@Entity 
@Table(name = "dbuser") 
public class dbuser implements java.io.Serializable { 

    @Id 
    //@GeneratedValue(strategy=GenerationType.AUTO) 
    @Column(name = "user_id") 
    private long user_id; 

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


    public dbuser() { 
    } 

    public dbuser(long user_id, String username) { 
     this.user_id = user_id; 
     this.username = username; 
    } 

    @Column(name = "username") 
    public String getUsername() { 
     return this.username; 
    } 

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

    @Column(name = "user_id") 
    public long getUser_id() { 
     return user_id; 
    } 

    public void setUser_id(long user_id) { 
     this.user_id = user_id; 
    } 
} 

hibernate.cfg.xmlの

<!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> 
     <property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property> 
     <property name="hibernate.connection.driver_class">org.postgresql.Driver</property> 
     <property name="hibernate.connection.username">postgres</property> 
     <property name="hibernate.connection.password">password</property> 
     <property name="hibernate.connection.url">jdbc:postgresql://localhost:5432/mydb</property> 
     <property name="connection_pool_size">1</property> 
     <property name="hbm2ddl.auto">create</property> 
     <property name="show_sql">true</property> 
     <mapping class="com.hibernateTest.User"/> 
    </session-factory> 
</hibernate-configuration> 

のpom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.mkyong.common</groupId> 
    <artifactId>HibernateExample</artifactId> 
    <packaging>jar</packaging> 
    <version>1.0</version> 
    <name>HibernateExample</name> 
    <url>http://maven.apache.org</url> 
    <repositories> 
     <repository> 
      <id>JBoss repository</id> 
      <url>http://repository.jboss.org/nexus/content/groups/public/</url> 
     </repository> 
    </repositories> 
    <dependencies> 
     <dependency> 
      <groupId>org.postgresql</groupId> 
      <artifactId>postgresql</artifactId> 
      <version>9.4-1203-jdbc4</version> 
     </dependency> 
     <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-core</artifactId> 
      <version>3.6.3.Final</version> 
     </dependency> 
     <dependency> 
      <groupId>javassist</groupId> 
      <artifactId>javassist</artifactId> 
      <version>3.12.1.GA</version> 
     </dependency> 
    </dependencies> 
</project> 

問題は、私は自分のアプリケーションを実行したときに私が得たということです。

Hibernate: select dbuser0_.user_id as user1_0_0_, dbuser0_.username as username0_0_ from dbuser dbuser0_ where dbuser0_.user_id=? 
Hibernate: insert into dbuser (username, user_id) values (?, ?) 

奇妙である最初の事はのある値があるということです(?、?)ターミナル。データベース内のテーブルのデータは更新のみですが、行を更新しない新しい行を挿入したいのですか? 私はこのコードが新しい行、新しい行を挿入するのではなく、行を更新する理由は何故ですか? ありがとうございます。

+0

のように使用してください。(読みにくい形式の)ログは、 'UPDATE'ではなく' INSERT'文を指定しているようです。だからなぜあなたはそうでないと主張するのですか? '? 'は値のプレースホルダーです。 – Kayaman

+0

"保存"はINSERTの同義語です。 – duffymo

+0

@Kayman「あなたが提供したログ(読みにくい形式)」 - >修正済み(ありがとう) duffymoはい、私はそれを知っているのですが、私はなぜこのテーブルを選択すると、その行が新しいものではなく更新されているのかを尋ねています。 – user2856064

答えて

0
dbuser dbuser = new dbuser(); 
dbuser.setUser_id(556); 
dbuser.setUsername("waaagr");  
session.merge(dbuser); 

ですから、ここで何をしているか、ID = 556を持つ一部のユーザーは、おそらくデータベースに存在している、とあなたがDBに変更をマージすることを休止状態語っています。これはいわゆると呼ばれ、エンティティです。

与えられたエンティティを指定されたID(したがってSELECT)でフェッチして、データベース内のデータとオブジェクト内のデータに違いがあるかどうかを確認し、「ダーティフィールド」でUPDATE操作をコミットします。同時に、マージ管理エンティティを返します。これは、JPA仕様のmergeが一般的にどのように動作するかです。

あなたのケースでは、そのエンティティは既に存在していますが、Hibernateはこれについて知っています(IDフェッチ用に空の結果が設定されているため)INSERTの実行はUPDATEです。

これをまとめます:IDを指定することで、特定のエンティティがデータベースに存在し、マージが可能であることを示しています。新しいユーザを作成したい場合は、savemerge

+0

ありがとうございます。私がマージしたコードを添付してくれてありがとうございました。私は "マージ"の代わりに "保存"を使用しようとしましたが、結果は同じで、なぜわかりませんか?たぶん私は設定でいくつかのバグを持っている可能性があります。 – user2856064

+0

次に私に実際のコードを表示 – Antoniossss

+0

コードは全く同じです。 "session.merge(dbuser);"の代わりに "私は "session.save(dbuser);"を持っています。 – user2856064

関連する問題