Gå til innhold

Bruk av enum i databaser og Java


Anbefalte innlegg

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

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 av wernie
Lenke til kommentar
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
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
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 av blackbrrd
Lenke til kommentar

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...