pgdx Skrevet 22. juni 2009 Del Skrevet 22. juni 2009 Hei. Hva er rådende best-practice på bruk av enum når man ønsker å lagre det i databaser? La os si man har en klasse A og den refererer til en enum B. Nå har jo de fleste databaser støtte for enumer også, og det er jo hensiktsmessig å ha dem der. Til nå har jeg pleid å løse det ved kun å bruke int i databasen og ha en look-up fra int til enum i Java: enum B { FIRST(1), SECOND(2); private final int id; private B(int id) { this.id = id; } public static B getB(int id) { for (B b : values()) { if (b.id == id) return b; } throw new IllegalArgumentException(id + " is not a valid id for B"); } } Dette betyr at det ikke er noe semantisk informasjon i databasen vedr. denne enumen, og det er litt leit. Noen bedre måter å gjøre dette på? Lenke til kommentar
blackbrrd Skrevet 22. juni 2009 Del Skrevet 22. juni 2009 Personlig så har jeg bare brukt en ekstra tabell og holdt meg langt unna ENUM... Lenke til kommentar
Patton Skrevet 22. juni 2009 Del Skrevet 22. juni 2009 (endret) Hva med Enum.valueOf og string? Endret 22. juni 2009 av Patton Lenke til kommentar
___ Skrevet 22. juni 2009 Del Skrevet 22. juni 2009 (endret) Det er fryktelig lenge siden jeg har håndkodet i Java mot databaser. I de aller fleste nye prosjekter jeg jobber med skrives domenemodellen i Java, og en eller annen implementasjon av JPA benyttes. Alle tabeller, skranker og sekvenser genereres automatisk i databasen. Hvis man skal programmere mot en eksisterende database, blir det straks litt verre, og ihvertfall hvis databasen inneholder særegenheter som enums. Fysj. Med JPA (Java Persistence API) kan du ha Enum-felter i entity-klassene dine, ved å bruke annotasjonen @Enumerated. Eksempel: @Column(nullable = false) @Enumerated(EnumType.ORDINAL) private EventType type; (EventType er her en Enum) I dette eksemplet vil feltet på databasenivå være en ordinal, dvs et tall, når man benytter EnumType.ORDINAL, mens den vil være i klartekst (navnet på enum-verdien, når man benytter EnumType.STRING. Husk at JPA bare er et API, som det finnes en rekke implementasjoner av. Jeg har brukt Hibernate, Oracle TopLink og i det siste EclipseLink, som Oracle har donert til Eclipse foundation. Werner Endret 22. juni 2009 av wernie Lenke til kommentar
blackbrrd Skrevet 23. juni 2009 Del Skrevet 23. juni 2009 Det er fryktelig lenge siden jeg har håndkodet i Java mot databaser. Nå er jeg litt nysgjerrig, hvis du har store rapporter så kan disse være et helvete å skrive i HQL/EQL e.l., hva gjør du her? Min erfaring er at disse må skrives i SQL for å få høy nok ytelse. Lenke til kommentar
___ Skrevet 23. juni 2009 Del Skrevet 23. juni 2009 Det er fryktelig lenge siden jeg har håndkodet i Java mot databaser. Nå er jeg litt nysgjerrig, hvis du har store rapporter så kan disse være et helvete å skrive i HQL/EQL e.l., hva gjør du her? Min erfaring er at disse må skrives i SQL for å få høy nok ytelse. Hvis man har mye eager fetching kan ting gå fryktelig tregt, da mye unødvendige data leses inn fra databasen. Werner Lenke til kommentar
blackbrrd Skrevet 23. juni 2009 Del Skrevet 23. juni 2009 (endret) Det er fryktelig lenge siden jeg har håndkodet i Java mot databaser. Nå er jeg litt nysgjerrig, hvis du har store rapporter så kan disse være et helvete å skrive i HQL/EQL e.l., hva gjør du her? Min erfaring er at disse må skrives i SQL for å få høy nok ytelse. Hvis man har mye eager fetching kan ting gå fryktelig tregt, da mye unødvendige data leses inn fra databasen. Werner Hmm... Du benytter deg av caching på applikasjonsserveren for å få ok ytelse? Det er ihvertfall et par ting som ikke er mulig å gjøre med HQL som går an å gjøre med SQL, f.eks LEFT JOIN med en ekstra AND clause. (Det er faktisk et av de problemene jeg støter borti mest). Bruker du aldri SQL for rapporter? Hvor store databaser (antall rader i tabeller, størrelse i mb) jobber du med? Endret 23. juni 2009 av blackbrrd Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå