2017-10-23 8 views
0

mysql을 사용하여 '최대 절전 모드'를 연습하고 있습니다.최대 절전 모드를 사용하여 동적으로 열을 추가하는 방법

최대 절전 모드를 사용하여 'ALTER TABLE Student ADD COLUMN phone varchar (255)'와 같은 새 열을 추가하고 싶습니다. 그러나 'addColumn()'함수를 코딩하는 방법을 모르겠습니다.

Student.java

package hib.dia.gol; 

public class Student 
{ 
    private long id; 
    private String name; 
    private String degree; 

    public Student() { 
     this.name = null; 
     this.degree = null; 
    } 

    public Student(String name, String degree) { 
     this.name = name; 
     this.degree = degree; 
    } 

    public long getId() { 
     return id; 
    } 

    public void setId(long id) { 
     this.id = id; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getDegree() { 
     return degree; 
    } 

    public void setDegree(String degree) { 
     this.degree = degree; 
    } 
} 

student.xml

<?xml version="1.0" encoding="UTF-8"?> 
    <!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 

<hibernate-mapping> 
    <class name="hib.dia.gol.Student" table="STUDENT"> 
     <id column="ID" name="id" type="long"> 
      <generator class="increment" /> 
    </id> 
      <property column="STUDENT_NAME" name="name" type="string" /> 
      <property column="DEGREE" name="degree" type="string" /> 
      <property column="PHONE" name="phone" type="string" /> 
    </class> 
</hibernate-mapping> 

configure.xml

<?xml version="1.0" encoding="utf-8"?> 
<!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.connection.driver_class">com.mysql.jdbc.Driver</property> 
     <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test</property> 
     <property name="hibernate.connection.username">test</property> 
     <property name="hibernate.connection.password">test</property> 
     <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> 
     <property name="show_sql">true</property> 
     <property name="format_sql">true</property> 
     <property name="hbm2ddl.auto"> update </property> 
     <mapping resource="hib/dia/gol/student.xml" /> 
    </session-factory> 
</hibernate-configuration> 

Test.java

package hib.dia.gol; 

import java.util.Iterator; 
import java.util.List; 

import org.hibernate.Query; 
import org.hibernate.Session; 
import org.hibernate.Transaction; 
import org.hibernate.SessionFactory; 
import org.hibernate.cfg.Configuration; 
import org.hibernate.HibernateException; 

public class Test 
{ 
    private static SessionFactory mFactory; 

    public static void main(String[] args) { 
     try { 
      mFactory = new Configuration().configure("configure.xml").buildSessionFactory(); 
     } catch (Throwable ex) { 
      System.err.println("Failed to create sessionFactory object." + ex); 
      throw new ExceptionInInitializerError(ex); 
     } 

     Test sTest = new Test(); 

     Long sSt1 = sTest.addStudent("Lee", "MD"); 
     Long sSt2 = sTest.addStudent("Kim", "DD"); 
     Long sSt3 = sTest.addStudent("Park", "MD"); 
     Long sSt4 = sTest.addStudent("Ha", "DD"); 
     Long sSt5 = sTest.addStudent("Kwak", "BD"); 
     Long sSt6 = sTest.addStudent("Oh", "DD"); 
     Long sSt7 = sTest.addStudent("Shin", "BD"); 

     sTest.listStudent(); 

     sTest.updateStudent(sSt3, "DD"); 

     sTest.listStudent(); 

     sTest.deleteStudent(sSt2); 

     sTest.listStudent(); 
    } 

    public Long addStudent(String name, String degree) { 
     Session session = mFactory.openSession(); 
     Transaction tx = null; 
     Long id = null; 

     try { 
      tx = (Transaction) session.beginTransaction(); 
      Student student = new Student(name, degree); 
      id = (Long) session.save(student); 
      tx.commit(); 

      System.out.println("add success"); 
     } catch(HibernateException e) { 
      if(tx != null) { 
       tx.rollback(); 
      } 
      System.out.println("add fail"); 
      e.printStackTrace(); 
     } finally { 
      session.close(); 
     } 
     return id; 
    } 

    public void listStudent() { 
     Session session = mFactory.openSession(); 
     Transaction tx = null; 
     Query query = null; 

     try{ 
      tx = session.beginTransaction(); 

      query = session.createQuery("FROM Student"); 

      query.setMaxResults(10); 
      query.setFirstResult(0); 
      query.setFetchSize(5); 

      @SuppressWarnings("unchecked") 
      List<Student> students = (List<Student>) query.list(); 

      for(Iterator<Student> iter = students.iterator(); iter.hasNext();) { 
       Student student = (Student) iter.next(); 
       System.out.print("id: " + student.getId()); 
       System.out.print(" name: " + student.getName()); 
       System.out.print(" degree: " + student.getDegree()); 
      } 

      tx.commit(); 
     } catch (HibernateException e) { 
      e.printStackTrace(); 
     } finally { 
      session.close(); 
     } 
    } 

    public void updateStudent(long id, String degree) { 
     Session session = mFactory.openSession(); 
     Transaction tx = null; 

     try { 
      tx = session.beginTransaction(); 

      Student student = (Student) session.get(Student.class, id); 
      student.setDegree(degree); 

      session.update(student); 

      tx.commit(); 

      System.out.println("update success"); 
     } catch (HibernateException e) { 
      if(tx != null) { 
       tx.rollback(); 
      } 
      System.out.println("update fail"); 
      e.printStackTrace(); 
     } finally { 
      session.close(); 
     } 
    } 

    public void deleteStudent(long id) { 
     Session session = mFactory.openSession(); 
     Transaction tx = null; 

     try { 
      tx = session.beginTransaction(); 
      Student student = (Student) session.get(Student.class, id);  
      session.delete(student); 
      tx.commit();   
      System.out.println("delete success"); 
     } catch (HibernateException e) { 
      if(tx != null) { 
       tx.rollback(); 
      } 

      System.out.println("delete fail"); 
      e.printStackTrace(); 
     } finally { 
      session.close(); 
     } 
    } 

    public addColumn(String table, String column, Types type) { 
     Session session = mFactory.openSession(); 
     Transaction tx = null; 
     Query query = null; 

    /* I don't know this part.*/ 
    } 
} 

최대 절전 모드를 사용하여 테이블에 열을 추가하는 방법을 알려주십시오.

답변

0

당신이 현재 테이블이 Hibernate를 사용하여 생성된다면 phone 속성에 대한 java 엔티티 클래스에 phone 속성을 간단히 추가 할 수있다.

속성을 update으로 설정하면 다음 번에 SessionFactory를 만들 때 hibernate가 자동으로이 열을 생성합니다.


Student.java

public class Student 
     { 
     private long id; 
     private String name; 
     private String degree; 
     private String phone; 

     //generate getters & setters 
     } 

또한 student.xml에서 전화 속성에 대한 매핑을 (최대 절전 모드 - 매핑 파일).

+0

대신 Student 클래스에 추가하십시오. alter table 절을 사용하면 다른 방법이 있습니다. –

+0

@KwangHunLee, Hibernate는 단지 엔티티 클래스 (즉, 학생 클래스)에 속성을 추가하여 열을 생성합니다. 왜 하드 코드하고 열을 추가해야합니까? 제 지식에 따르면, ur 수정 프로퍼티를 추가하는 것이 가장 좋은 방법입니다 갱신하려면 hibernate.hbm2ddl.auto를 실행하십시오. –

+0

왜냐하면, 나는 우리 고유의 Dialect 클래스를 만들고 있기 때문이다. Diaclect 기능에 대한 모든 것을 테스트해야합니다. –