2013-04-14 9 views
8

Od pewnego czasu borykam się z wyliczaniem, ale to nie pójdzie po mojej myśli. Czy jest ktoś, kto może dać mi wskazówkę? Próbuję użyć typu Enum w MySql i również używam klasy Enum w moim kodzie.Jak zmapować typ Enum w mybatis za pomocą wpisuHandler na włożeniu

Kod jest teraz Zostanie wstawiony PONIEDZIAŁEK, ale będzie również próbował wstawić PONIEDZIAŁEK w dniu roboczymID ... Nie otrzymam identyfikatora workdayID. Wierzę, że muszę sobie poradzić z DAY_TYPE w jakiś sposób ... zdefiniować typHandler może? ale próbowałem tego i to nie zadziałało, czy też nie mogłem zrobić tego poprawnie?

Próbowałem też org.apache.ibatis.type.EnumTypeHandler ale bez powodzenia, podobnie jak to

#{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> 

Moja tabela bazy danych

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

Może nie można używać enum jako parametru parameter? Podoba Ci się to 'parameterType =" DAY_TYPE "' – user2279869

+0

OK, ktoś? Przynajmniej powiedz mi, czy jestem niecierpliwy, czy nie odrabiałam pracy domowej lub brakuje czegoś innego, i tak, wiem, że niektórzy ludzie mówią, że zwykle nie przechowujemy wartości wyliczeniowej w kodzie, a w bazie danych tylko identyfikator. – user2279869

+0

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

Odpowiedz

7

Workday istnieje jako ten

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.... 

Prawidłowe rozwiązanie jest oczywiście, aby dodać enum w tabeli dnia pracy ... i będzie reduse bazie wykorzystać wiele wierzę.

<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> 

A teraz usuwać daytaype tabeli I dodać enum bezpośrednio w tabeli dzień roboczy zamiast.

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 w Twoim przypadku zawiera identyfikator członka. Teraz, jeśli przechowujesz ENUM jako id w bazie danych, zawsze możesz użyć CustomEnumTypeHandler, który może obsłużyć DAY_TYPE, nawet jeśli nie masz zsynchronizowanej Enum z bazą danych.