이라는 테이블이 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<=>false,EMPTY<=>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일
에 추가, 내가 만든
(간단한 변화)
- 추가 된 클래스 CharToBoolUserTy : 코드 변경 다음
- 는 HBM 요소의 변경
type
-attribute로 pe : RefundRule.hbm.xml에 백분율을
클래스 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; } }
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<=>false,EMPTY<=>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)
을해야하나요?original
을 target
으로 대체하고 owner
에 넣으십시오. 이 경우 original
은 String
유형이고 target
은 Boolean
유형이고 owner
은 RefundRule
유형입니다.
이 코드를 개선하기위한 제안은 언제나 환영합니다.
============================================== === 그냥 참조
는, 클래스 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;
}
}