Java 将MySQL中的字符(0)映射到Hibernate中的布尔值

Java 将MySQL中的字符(0)映射到Hibernate中的布尔值,java,mysql,hibernate,Java,Mysql,Hibernate,我在mysql(5.5版)中有一个名为return\u rule的表。以下是它的定义: 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(1

我在mysql(5.5版)中有一个名为
return\u rule
的表。以下是它的定义:

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`)
);
NetBeans(7.0版)中向导生成的类如下:

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()
,并更改了方法
setPercentage(String)
,这样我就可以在Java(1.6版)程序中将该
String
对象用作
boolean

我的问题是:

有什么方法可以让我只保留两个方法:
setPercentage(boolean)
isPercentage()
,并将
boolean percentage
变量映射到mysql中的
percentage CHAR(0)
变量

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

2013年11月23日新增编辑

根据@greybeardgeek的回答,我在代码中做了以下更改:

(简要更改)

  • 添加了类ChartBoluserType
  • 更改了hbm元素的
    类型
    -属性:returnRule.hbm.xml中的百分比
  • (与上述变更相关的代码)

  • ChartBoolUserType类:

    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;
        }
    }
    
  • 文件returnrule.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>
    

    我相信您正在寻找Hibernate的用户类型,它允许您提供自定义类型映射

    比如说,

    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;
        }
    }
    
    <?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>
    
    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;
        }
    
    }