windows7x64에 Postgres 버전 10.1을 설치했습니다. 하나의 테이블 "dbuser"와 컬럼 "user_id"와 "username"을 가진 데이터베이스 "postgres"를 가지고 있습니다. Intelij와 Maven을 사용하고 있습니다. hibernate에서 세션을 사용하여 테이블에 행을 삽입하려고합니다.하이버 네이트 세션이 행을 삽입하는 대신 업데이트 행을 저장하는 이유는 무엇입니까?
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