2017-12-29 63 views
0

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 (?, ?) 

이상하다 우선은에서와 값이 때문이다 (?) 단말기. 그리고 데이터베이스의 테이블에있는 데이터는 업데이트 만되었지만 행을 업데이트하지 않는 새 행을 삽입하고 싶습니다. 이 코드가 새로운 행, 새로운 행을 삽입하는 대신 행을 업데이트하는 이유는 무엇입니까? 대단히 감사합니다. 여기서 뭐하는 그래서

+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에 변경 사항을 병합 할. 이것은 이라고 불리는 개체입니다. 하고 무엇 병합

는 데이터베이스 및 개체의 데이터 사이에 약간의 차이가있는 경우 (따라서 SELECT), 확인 제공 id로 주어진 개체를 가져 오는이며, "더러운 필드"에 UPDATE 작업을 커밋합니다. 같은 시간에 병합 엔터티를 반환합니다. 이것은 JPA 스펙에 따라 merge이 일반적으로 작동하는 방법입니다.

당신의 경우에, 당신은 그 엔티티가 이미 존재한다는 것을 거짓말을했다. 그러나 Hibernate는 이것 (ID 페치를 위해 빈 결과가 설정 되었기 때문에)을 알았고 INSERT 어시스트 UPDATE을 수행한다.

그래서 마무리하십시오 : ID를 제공함으로써 주어진 엔티티가 데이터베이스에 존재해야하며 병합이 가능함을 나타냅니다. 새로운 사용자를 만들려면 save을 입력하십시오. merge

+0

대단히 고맙습니다. 병합으로 코드를 첨부 한 것은 제 잘못입니다. "병합"대신 "저장"을 사용하려고했지만 결과가 동일하며 이유를 모르겠습니다.어쩌면 구성에 버그가있을 수 있습니다. – user2856064

+0

다음 날 실제 코드를 보여 – Antoniossss

+0

코드는 꽤 동일합니다. "session.merge (dbuser);"대신 " 내가 가진 "session.save (dbuser);". – user2856064