Domanda

Quindi, sto lavorando su un progetto (JSF2, Spring3 core, MVC, WebFlow, MyBatis3, RichFaces, e un patrimonio Oracle 10g). La fonte di tutti i miei di problemi ha a che fare con la progettazione del database. Il problema è che la maggior parte dei tavoli DB hanno cambiare schema (cattivo design forse?). Così ho bisogno di essere in grado di supportare l'aggiunta e la rimozione di colonne aggiuntive.

Per accogliere questo ho fatto dei dati di tiro MyBatis in un oggetto dominio personalizzato "universale", che fondamentalmente solo si estende un HashMap. Il mio problema attuale è l'aggiornamento questi oggetti HashMap. Ci dovrebbe essere un modo per farlo funzionare, ma io riesco a ottenere MyBatis a cooperare. Ho provato con HashMap.entrySet () & MyBatis di, ma senza alcun risultato. ad es.

UPDATE MYTABLE
SET 
<foreach collection="entries" index="i" item="entry" close=""  open="" separator=", ">
  #{entry.key} = #{entry.value}
</foreach>
WHERE FOO='BAR';

Ho provato un TypeHandler personalizzato ma setParameter () non mi dà abbastanza l'accesso per fare quello che mi serve. Un resultHandler non mi ha dato abbastanza l'accesso ad ogni singolo risultato, quindi non ho potuto usare che o.

Ora so che potrei fare qualcosa di simile Obj.createUpdateSqlString () e inserirla nel mapper come una stringa letterale, ma questo è un po 'di un hack e se ne va mi apro a SQL injection. Senza contare che comporterebbe sfuggire un sacco di stringhe, e che rappresentano una vasta gamma di possibili input e meno che tutte le possibilità sono coperti che si apre la porta per alcuni bug gravi.

Quindi non v'è uno strumento tradizionale per fare questo? O almeno un modo decente? Ho sentito parlare di un certo numero di sostenitori accaniti MyBatis dicono di essere ancora incontrare una situazione MyBatis non poteva gestire con grazia; così gli esperti MyBatis, Please help me out !!

È stato utile?

Soluzione

Sembra che stavano cercando di evitare l'uso di tabelle EAV.

Devi scegliere il tuo veleno quando si tratta di campi aggiungendo dinamicamente. EAV è buono dal punto di vista teoria, ma ha gravi problemi di prestazioni su tabelle di grandi dimensioni. Mentre l'aggiunta di colonne in modo dinamico è meglio per la query prestazioni hai a che fare con un'interfaccia fasciatoio e SQL dinamico. Non vorrei scrivere il database off come una cattiva progettazione a titolo definitivo.

Si consiglia di bypass il quadro che si sta utilizzando. Query vostro schema della tabella (per Oracle sguardo USER_TAB_COLUMNS) e generare gli script di inserimento / aggiornamento. Parametrizzare loro in modo che siano al sicuro da iniezione. Sarà un mal di testa, ma non vedo un'alternativa.

Altri suggerimenti

MyBatis o Hibernate sia puzza con schemeas di database folli. Vorrei solo usare SpringJDBC o simili.

Non cercare di fare un piolo in forma rotonda in un foro quadrato, anche se è davvero un bel perno rotondo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top