2013-04-14 7 views
8

abbilde Ich habe mit enum für eine Weile jetzt gekämpft, aber es wird nicht meinen Weg gehen. Gibt es jemanden, der mir einen Hinweis geben kann? Ich versuche, Enum-Typ in MySql zu verwenden, und ich verwende auch eine Enum-Klasse in meinem Code.Wie man Enum-Typ in mybatis mit typeHandler auf Einfügung

Wie der Code jetzt ist Es wird MONTAG einfügen, aber es wird auch versuchen, MONTAG auf ArbeitstagID einfügen ... Ich bekomme nicht die ArbeitstagID. Ich glaube, ich muss mit dem DAY_TYPE in gewisser Weise umgehen ... definieren Sie einen TypHandler vielleicht ?? aber ich habe das versucht und es würde nicht funktionieren, oder es ist, weil ich es nicht richtig machen kann?

Ich habe auch versucht die org.apache.ibatis.type.EnumTypeHandler aber ohne Erfolg, wie dieser

#{DAY_TYPE,typeHandler=org.apache.ibatis.type.EnumTypeHandler} 

DAY_TYPE.java

package tut.model; 
    import java.io.Serializable; 
    public enum DAY_TYPE implements Serializable{ 
     MONDAY(1),TUESDAY(2),WEDNESDAY(3),THURSDAY(4),FRIDAY(5),SATURDAY(6),SUNDAY(7); 
     private int id; private int workdayID; 

     private DAY_TYPE(int id) { this.id = id; } 

     public int getId() { return id; } 
     public void setId(int id) { this.id = id; } 

     public int getWorkdayID() { return workdayID; } 
     public void setWorkdayID(int workdayID) {this.workdayID = workdayID;} 
    } 

DAY_TYPE_Mapper.xml

<insert id="insert" parameterType="DAY_TYPE" useGeneratedKeys="true" keyProperty="iddaytaype"> 
     INSERT INTO daytaype (DAY_TYPE, workdayID) 
     VALUES (#{DAY_TYPE},#{workdayID}) 
     <selectKey keyProperty="iddaytaype" resultType="long" order="AFTER"> 
      SELECT LAST_INSERT_ID(); 
     </selectKey> 
    </insert> 

<!-- <insert id="insert" parameterMap="insert-params" useGeneratedKeys="true" keyProperty="iddaytaype"> --> 
    <parameterMap id="insert-params" type="DAY_TYPE"> 
     <parameter property="DAY_TYPE" javaType="DAY_TYPE" typeHandler="mappings.XenumTypeHandler" /> 
     <parameter property="workdayID" javaType="int" /> 
    </parameterMap> 

Meine Datenbanktabelle

CREATE TABLE `daytaype` (
     `iddaytaype` int(11) NOT NULL AUTO_INCREMENT, 
     `DAY_TYPE` enum('MONDAY','TUESDAY','WEDNESDAY','THURSDAY','FRIDAY','SATURDAY','SUNDAY') NOT NULL, 
     `workdayID` int(11) unsigned DEFAULT NULL, 
     PRIMARY KEY (`iddaytaype`), 
     KEY `fk_workDayID_idWorkDay` (`workdayID`) 
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;=InnoDB DEFAULT CHARSET=utf8;  
+0

Vielleicht kann man enum nicht als ParameterType verwenden? Wie diese 'parameterType =" DAY_TYPE "' – user2279869

+0

Ok, jemand? Sag mir wenigstens, wenn ich ungeduldig bin oder meine Hausaufgaben nicht gemacht habe oder etwas anderes fehlt, und ja ich weiß, dass manche Leute sagen, dass man normalerweise keinen Enum-Wert im Code speichert und in der Datenbank nur die ID. – user2279869

+0

http://stackoverflow.com/questions/10219253/mybatis-enum-usage – jalopaba

Antwort

7

Workday existiert, da dies

public class Workday implements Serializable{ 
     private long idWorkDay; 
     private Date start; 
     private Date end; 
     private List<Workbreak> workBreaks; 
     private DAY_TYPE DAY_TYPE; 
     private long workweekID; 
     getter setter.... 

Die richtige Lösung ist natürlich Enum in der Arbeitstag Tabelle hinzuzufügen ... und es wird reduse Datenbank viel ich glaube ergreifen.

<insert id="insert" parameterType="workday" useGeneratedKeys="true" keyProperty="idWorkDay"> 
     INSERT INTO workday 
     (start , end , workweekID , DAY_TYPE) 
     VALUES (
     #{start}, 
     #{end}, 
     #{workweekID}, 
     #{DAY_TYPE, typeHandler=org.apache.ibatis.type.EnumTypeHandler} 
    ) 
     <selectKey keyProperty="idWorkDay" resultType="long" order="AFTER"> 
      SELECT LAST_INSERT_ID(); 
     </selectKey> 
    </insert> 

Und jetzt statt daytaype Tisch Und fügen Sie Aufzählungs direkt in Arbeitstag Tabelle löschen.

CREATE TABLE `workday` (
     `idworkday` int(11) NOT NULL AUTO_INCREMENT, 
     `start` time DEFAULT '08:00:00', 
     `end` time DEFAULT '17:00:00', 
     `workweekID` int(11) DEFAULT NULL, 
     `DAY_TYPE` enum('MONDAY','TUESDAY','WEDNESDAY','THURSDAY','FRIDAY','SATURDAY','SUNDAY') DEFAULT NULL, 
     PRIMARY KEY (`idworkday`), 
     KEY `fk_workweek_workweekID` (`workweekID`), 
     CONSTRAINT `fk_workweek_workweekID` FOREIGN KEY (`workweekID`) REFERENCES `workweek` (`idworkweek`) ON DELETE CASCADE ON UPDATE NO ACTION 
    ) ENGINE=InnoDB AUTO_INCREMENT=139 DEFAULT CHARSET=utf8 ; 
0

DAY_TYPE enthält in Ihrem Fall eine Mitglieds-ID. Jetzt, wenn Sie Ihre ENUM als ID in der Datenbank speichern, können Sie immer einen CustomEnumTypeHandler verwenden, der DAY_TYPE für Sie verarbeiten kann, auch wenn Sie Ihre Enum nicht mit Ihrer Datenbank synchronisiert haben.