2013-11-14 2 views
0

이라는 테이블이 mysql (버전 5.5)에 있습니다.RefundRule 이름MySQL에서 CHAR (0)을 최대 절전 모드에서 부울로 매핑

CREATE TABLE `refund_rule` (
    `ID` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `PERCENTAGE` char(0) DEFAULT NULL COMMENT 'BOOLEAN shortcut.NULL<=>false,EMPTY<=>true', 
    `DEDUCTION_AMOUNT` int(10) unsigned DEFAULT NULL, 
    PRIMARY KEY (`ID`) 
); 

최대 절전 모드 에 해당하는 클래스 (3.2 버전) : 여기의 정의입니다.

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping> 
    <class name="hibernatesample.dao.RefundRule" table="refund_rule" catalog="back_end_proc"> 
     <id name="id" type="java.lang.Integer"> 
      <column name="ID" /> 
      <generator class="identity" /> 
     </id> 
     <property name="percentage" type="string"> 
      <column name="PERCENTAGE" length="0"> 
       <comment>BOOLEAN shortcut.NULL&lt;=&gt;false,EMPTY&lt;=&gt;true</comment> 
      </column> 
     </property> 
     <property name="deductionAmount" type="java.lang.Integer"> 
      <column name="DEDUCTION_AMOUNT" /> 
     </property> 
    </class> 
</hibernate-mapping> 

넷빈즈 에서 마법사에 의해 생성 된 클래스 (버전 7.0)이되었다 : 나는 그것을 2 개 방법을

public class RefundRule implements java.io.Serializable { 

    private Integer id; 
    private String percentage; 
    private Integer deductionAmount; 

    public CancellationRule() { 
    } 

    public CancellationRule(String percentage, Integer deductionAmount) { 
     this.percentage = percentage; 
     this.deductionAmount = deductionAmount; 
    } 

    public Integer getId() { 
     return this.id; 
    } 

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

    public String getPercentage() { 
     return this.percentage; 
    } 

    public void setPercentage(String percentage) { 
     this.percentage = percentage; 
    } 

    public Integer getDeductionAmount() { 
     return this.deductionAmount; 
    } 

    public void setDeductionAmount(Integer deductionAmount) { 
     this.deductionAmount = deductionAmount; 
    } 

} 

추가 setPercentage(boolean) & isPercentage(), 및 HBM 파일은 다음과 같다 난 내 자바 (버전 1.6) 프로그램에 boolean로 그 String 개체를 사용할 수 있도록하는 방법 setPercentage(String)을 변경했습니다.

public class RefundRule implements java.io.Serializable { 

    . 
    . 
    . 

    public String getPercentage() { 
     return this.percentage; 
    } 

    public void setPercentage(String percentage) { 
     this.percentage = percentage==null?null:""; 
    } 

    . 
    . 
    . 

    public void setPercentage(boolean percentage){ 
     setPercentage(percentage?"":null); 
    } 

    public boolean isPercentage(){ 
     return percentage!=null; 
    } 

} 

내 질문은 :

이 내가 단지 두 가지 방법을 유지할 수있는 방법이다 : setPercentage(boolean)isPercentage(),와 MySQL의 boolean percentage 변수 PERCENTAGE CHAR(0)에 변수를 매핑합니다.

============================================== =====================

편집이 @GreyBeardedGeek에 의해 대답에 따라 2013년 11월 23일

에 추가, 내가 만든

(간단한 변화)

  1. 추가 된 클래스 CharToBoolUserTy : 코드 변경 다음
  2. 는 HBM 요소의 변경 type -attribute로 pe : RefundRule.hbm.xml에 백분율을

  1. 클래스 CharToBoolUserType (코드는 상술 한 변경과 관련된)

    import java.io.Serializable; 
    import java.sql.PreparedStatement; 
    import java.sql.ResultSet; 
    import java.sql.SQLException; 
    import java.sql.Types; 
    
    import org.hibernate.HibernateException; 
    import org.hibernate.usertype.UserType; 
    
    public class CharToBoolUserType implements UserType { 
    
        private static final int[] SQL_TYPES = {Types.CHAR}; 
    
        @Override 
        public Object assemble(Serializable serializable, Object object) throws HibernateException { 
         return serializable; 
        } 
    
        @Override 
        public Object deepCopy(Object object) throws HibernateException { 
         return object; 
        } 
    
        @Override 
        public Serializable disassemble(Object value) throws HibernateException { 
         return (Serializable) value; 
        } 
    
        @Override 
        public boolean equals(Object x, Object y) throws HibernateException { 
         if (x == y) { 
          return true; 
         } else if (x == null || y == null) { 
          return false; 
         } else { 
          return x.equals(y); 
         } 
        } 
    
        @Override 
        public boolean isMutable() { 
         return false; 
        } 
    
        @Override 
        public Object nullSafeGet(ResultSet resultSet, String[] names, Object owner) throws HibernateException, SQLException { 
         return resultSet.getObject(names[0]) != null; 
        } 
    
        @Override 
        public void nullSafeSet(PreparedStatement preparedStatement, Object value, int index) throws HibernateException, SQLException { 
         preparedStatement.setObject(index, ((Boolean) value).booleanValue() ? "" : null); 
        } 
    
        @Override 
        public Object replace(Object original, Object target, Object owner) throws HibernateException { 
         return original; 
        } 
    
        @Override 
        public Class returnedClass() { 
         return boolean.class; 
        } 
    
        @Override 
        public int[] sqlTypes() { 
         return SQL_TYPES; 
        } 
    
        @Override 
        public int hashCode(Object object) throws HibernateException { 
         if (object == null) { 
          return 0; 
         } 
         // is `object` a String ? Or boolean? 
         return 1; 
        } 
    } 
    
  2. RefundRule.hbm.xml 파일 :

    <?xml version="1.0"?> 
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
    <hibernate-mapping> 
        <class name="hibernatesample.dao.RefundRule" table="refund_rule" catalog="back_end_proc"> 
         <id name="id" type="java.lang.Integer"> 
          <column name="ID" /> 
          <generator class="identity" /> 
         </id> 
         <property name="percentage" type="hibernatesample.dao.CharToBoolUserType"> 
          <column name="PERCENTAGE" length="0"> 
           <comment>BOOLEAN shortcut.NULL&lt;=&gt;false,EMPTY&lt;=&gt;true</comment> 
          </column> 
         </property> 
         <property name="deductionAmount" type="java.lang.Integer"> 
          <column name="DEDUCTION_AMOUNT" /> 
         </property> 
        </class> 
    </hibernate-mapping> 
    

나는 class CharToBoolUserType의 코드가 모든 의미에서 완료 할 때문에, 나는 다음과 같은 한 질문 :
1. hashCode(Object object), Boolean 또는 String에서 object의 클래스가 무엇입니까? 누가이 방법을 부르는가?
2. 어떤 방법으로 public Object replace(Object original, Object target, Object owner)을해야하나요?originaltarget으로 대체하고 owner에 넣으십시오. 이 경우 originalString 유형이고 targetBoolean 유형이고 ownerRefundRule 유형입니다.

이 코드를 개선하기위한 제안은 언제나 환영합니다.

============================================== === 그냥 참조

는, 클래스 RefundRule은 지금과 같다 :

public class RefundRule implements java.io.Serializable { 

    private Integer id; 
    private boolean percentage; 
    private Integer deductionAmount; 

    public RefundRule() { 
    } 


    public RefundRule(boolean percentage, Integer deductionAmount) { 
     this.percentage = percentage; 
     this.deductionAmount = deductionAmount; 
    } 

    public Integer getId() { 
     return this.id; 
    } 

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

    public Integer getDeductionAmount() { 
     return this.deductionAmount; 
    } 

    public void setDeductionAmount(Integer deductionAmount) { 
     this.deductionAmount = deductionAmount; 
    } 

    public void setPercentage(boolean percentage){ 
     this.percentage=percentage; 
    } 

    public boolean isPercentage(){ 
     return percentage; 
    } 

} 

답변

관련 문제