私は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 (?, ?)
奇妙である最初の事はのある値があるということです(?、?)ターミナル。データベース内のテーブルのデータは更新のみですが、行を更新しない新しい行を挿入したいのですか? 私はこのコードが新しい行、新しい行を挿入するのではなく、行を更新する理由は何故ですか? ありがとうございます。
のように使用してください。(読みにくい形式の)ログは、 'UPDATE'ではなく' INSERT'文を指定しているようです。だからなぜあなたはそうでないと主張するのですか? '? 'は値のプレースホルダーです。 – Kayaman
"保存"はINSERTの同義語です。 – duffymo
@Kayman「あなたが提供したログ(読みにくい形式)」 - >修正済み(ありがとう) duffymoはい、私はそれを知っているのですが、私はなぜこのテーブルを選択すると、その行が新しいものではなく更新されているのかを尋ねています。 – user2856064