2010-04-15 15 views
5

Web uygulamamda Java/Spring MVC ve Hazırda Bekleme modunu kullanarak basit bir EAV deseni oluşturmaya çalışıyorum. Bu senaryo için hazırda bekletilen XML kurulumunun arkasındaki sihri anlayamıyorum.Kullanıcı için Hazırda Beklet özelliği olan EAV deseninin uygulanması -> Ayarlar ilişkisi

Benim veritabanı tablosu "AYAR" üç sütun bulunur:

  • user_id (FK) veritabanı bileşik anahtar user_id oluşur

  • setup_item
  • setup_value | İşte Setup.java sınıfı var

    setup_item: Hazırda kurulumu ile

    public class Setup implements CommonFormElements, Serializable { 
        private Map data = new HashMap(); 
        private String saveAction; 
        private Integer speciesNamingList; 
        private User user; 
    
        Logger log = LoggerFactory.getLogger(Setup.class); 
    
        public String getSaveAction() { 
        return saveAction; 
        } 
    
        public void setSaveAction(String action) { 
        this.saveAction = action; 
        } 
    
        public User getUser() { 
        return user; 
        } 
    
        public void setUser(User user) { 
        this.user = user; 
        } 
    
        public Integer getSpeciesNamingList() { 
        return speciesNamingList; 
        } 
    
        public void setSpeciesNamingList(Integer speciesNamingList) { 
        this.speciesNamingList = speciesNamingList; 
        } 
    
        public Map getData() { 
        return data; 
        } 
    
        public void setData(Map data) { 
        this.data = data; 
        } 
    }

    Benim sorunum, ben gerçeği haritasını anlamaya görünmektedir olamaz olduğu bir yabancı anahtar ve anahtar Bir haritanın tablosu, kompozit anahtarı oluşturacak ... Bu, Hazırda Bekletme özelliğini kullanan bir deneyim eksikliği nedeniyle.

    <composite-id> 
        <key-many-to-one foreign-key="id" name="user" column="user_id" class="Business.User"> 
        <meta attribute="use-in-equals">true</meta> 
        </key-many-to-one> 
    </composite-id> 
    
    <map lazy="false" name="data" table="setup"> 
        <key column="user_id" property-ref="user"/> 
        <composite-map-key class="Command.Setup"> 
        <key-property name="data" column="setup_item" type="string"/> 
        </composite-map-key> 
    
        <element column="setup_value" not-null="true" type="string"/> 
    </map> 
    

    düzgün bu ortak senaryoyu haritası nasıl içine herhangi bir fikir en mutluluk duyacağız: İşte işin bu almak benim ilk denemem!

    kendiniz gösterildiği gibi
  • +0

    @Trevor Hoş geldiniz, ama yararlı bir yanıt görürseniz, UPvote, Teşekkürler! –

    cevap

    2

    , sahip bir tutarsız haritalama

    Sen Kur sınıfı (SetupId i Bileşik birincil anahtar sınıfı oluşturduk Bildirimi kompozit birincil anahtar (tanımlar dedi - Serializable uygulayan gereken) aşağıya bakın ve eşittir ve karma kodudur yöntemi) Çünkü senin Kur sınıfının

    package ar.domain; 
    
    import java.io.Serializable; 
    import java.util.HashMap; 
    import java.util.Map; 
    
    public class Setup implements Serializable { 
    
        private SetupId setupId; 
    
        private User user; 
        private Map data= new HashMap(); 
    
        public SetupId getSetupId() { 
         return setupId; 
        } 
    
        public void setSetupId(SetupId setupId) { 
         this.setupId = setupId; 
        } 
    
        public User getUser() { 
         return user; 
        } 
    
        public void setUser(User user) { 
         this.user = user; 
        } 
    
        public Map getData() { 
         return data; 
        } 
    
        public void setData(Map data) { 
         this.data = data; 
        } 
    
    
        public static class SetupId implements Serializable { 
    
         private Integer userId; 
         private String setupItem; 
    
         public String getSetupItem() { 
          return setupItem; 
         } 
    
         public void setSetupItem(String setupItem) { 
          this.setupItem = setupItem; 
         } 
    
         public Integer getUserId() { 
          return userId; 
         } 
    
         public void setUserId(Integer userId) { 
          this.userId = userId; 
         } 
    
         @Override 
         public boolean equals(Object o) { 
          if (o == null) 
           return false; 
    
          if (!(o instanceof SetupId)) 
           return false; 
    
          final SetupId other = (SetupId) o; 
          if (!(getUserId().equals(other.getUserId()))) 
           return false; 
          if (!(getSetupItem().equals(other.getSetupItem()))) 
           return false; 
    
          return true; 
         } 
    
         @Override 
         public int hashCode() { 
          int hash = 7; 
          hash = 11 * hash + (getUserId() != null ? getUserId().hashCode() : 0); 
          hash = 11 * hash + (getSetupItem() != null ? getSetupItem().hashCode() : 0); 
          return hash; 
         } 
    
        } 
    
    } 
    

    değer Türü, Harita, sen tanımlamak gerekir sahiptir onun kompozit yabancı anahtar ilişkisini tanımlarken (anahtar elemanı bakınız)

    <class name="ar.domain.Setup"> 
        <composite-id name="setupId" class="ar.domain.Setup$SetupId"> 
         <key-property name="setupItem" type="string" column="SETUP_ITEM"/> 
         <key-property name="userId" type="integer" column="USER_ID"/> 
        </composite-id> 
        <many-to-one name="user" class="ar.domain.User" column="USER_ID" insert="false" update="false"/> 
        <map name="data" table="DATA_TABLE"> 
         <key> 
          <column name="SETUP_ITEM"/> 
          <column name="USER_ID"/> 
         </key> 
         <map-key column="USER_ID"/> 
         <element column="SETUP_VALUE" not-null="true" type="string"/> 
        </map> 
    </class> 
    

    Ve aynı zamanda, birleşik bir dış anahtar sütunu, map-key (USER_ID, right?) Olarak anlamlandırılmıyor. Niye ya ?Burada Varsayalım gider

    • hazırda kompozit birincil anahtar

      otomatik nesil desteklemez, sen Bunun yanı sıra

    bir (kompozit) güncellemek birincil anahtar sütunu izin Hazırda vermez senin KURULUM Tablo

    SETUP_ITEM USER_ID 
    0   1 
    0   2 
    

    Ve değer 3'tür bir USER_ID tanımlamak vermediğinden AYAR Tablo biri

    Integer userId = 3; 
    String setupValue = "someValue"; 
    
    setup.getData().put(userId, setupValue); 
    

    aşağıdakileri deneyin olmadığını ne olur senin DATA_TABLE

    SETUP_ITEM USER_ID 
    0   1 
    

    , bir kısıtlama ihlali göreceksiniz. Eğer güncellenebilir olamaz bir (kompozit) birincil anahtar, varsa

    , önlemek buna bağlı bir değişken özelliğini değiştirmek için, bir şekilde, kullanmak için zihin

    muhafaza ediniz. Aksi takdirde, Hazırda Bekletme şikayet edecektir.

    İlgili konular