'Enumaration' mit Strings

Hallo zusammen,

ich möchte nur bestimmte Werte zulassen, z.B. welche Rollen in einer Anwendung vorhanden sind. Diese sollen aber als Strings gespeichert werden (in der Datenbank).
Deswegen geht der folgende Ansatz nicht:
public enum Role {
ROLE_ADMIN, ROLE_CUSTOMER, ROLE_EMPLOYEE
}
Gibt es was eleganteres als folgendes?
public class Roles {
private static final String ROLE_ADMIN = „ROLE_ADMIN“;
private static final String ROLE_CUSTOMER = „ROLE_CUSTOMER“;
private static final String ROLE_EMPLOYEE = „ROLE_EMPLOYEE“;
}

Die Rollten sollen auch in der Form „ROLE_ADMIN“ gespeichert werden.

Vielen Dank
Richard

Hallo.

Sorry, aber so ganz hab ich dein Problem leider nicht verstanden…

ich möchte nur bestimmte Werte zulassen, z.B. welche Rollen in
einer Anwendung vorhanden sind. Diese sollen aber als Strings
gespeichert werden (in der Datenbank).

Ist die Anzahl der Strings fest? Gibt es nur ein klar definierte Menge dieser Rollen oder ist diese variabel? Sind die Namen fest definiert oder variabel?

Deswegen geht der folgende Ansatz nicht:
public enum Role {
ROLE_ADMIN, ROLE_CUSTOMER, ROLE_EMPLOYEE
}
Gibt es was eleganteres als folgendes?
public class Roles {
private static final String ROLE_ADMIN = „ROLE_ADMIN“;
private static final String ROLE_CUSTOMER = „ROLE_CUSTOMER“;
private static final String ROLE_EMPLOYEE = „ROLE_EMPLOYEE“;
}

Je nachdem, was du damit eigentlich vor hast, nehmen sich die beiden Versionen nicht viel…

Die Rollen sollen auch in der Form „ROLE_ADMIN“ gespeichert
werden.

Wenn die Rollen definiert sind und sich deren Menge und Name nicht ändert, warum willst du sie in der Datenbank speichern? Anders herum: wenn die Anzahl und Namen der Rollen variabel und änderbar sind, ist keine der beiden statischen Ansätze hilfreich.

Chris

Anmerkung
Ich hab nochmal drüber nachgedacht:

Mal angenommen die Anzahl und Namen der Rollen seien konstant und die Einträge in der Datenbank würde nicht manuel eingetragen werden, könntest du doch einen Enum verwenden.

public enum Role {
 ADMIN,
 CUSTOMER,
 EMPLOYEE
}

Du könntest dann über die valueOf(String)-Methode Dir eine Enum-Instanz erzeugen lassen.

Role role = Role.valueOf(/\* Dein String aus der DB \*/);

Chris

Ich gebe es zu, es ist nicht einfach zu verstehen:smile:
Die Rollen sind schon fest. Ich brauche sie um mit Spring ACEGI die user zu authorisieren.
Wenn ich einen Kunden habe, bekommt er die Rolle ROLE_CUSTOMER.
Ich brauche diesen Rollen-String in meiner Datenbank abfrage:

select name, role from customers …
Die Klasse wird mit Hibernate auf die DB gemappt und funzt auch alles.

Ich möchte einfach sichergehen, dass keine andere Rollen vergeben werden können.
Innerhalb der Customer-Klasse habe ich einen String role

private String role = Roles.ROLE_CUSTOMER;
wobei die Klasse Roles wie folgt definiert ist
public class Roles {
public static final String ROLE_ADMIN = „ROLE_ADMIN“;
public static final String ROLE_CUSTOMER = „ROLE_CUSTOMER“;
public static final String ROLE_EMPLOYEE = „ROLE_EMPLOYEE“;
}

Ich finde diese Art nicht elegant. Ich möchte role nur einen String-Wert aus der Menge „ROLE_ADMIN“, „ROLE_CUSTOMER“, „ROLE_EMPLOYEE“ zuordnen.

mit enum bekomme ich nur Integer oder? zumindest wurden sie so in die Datenbank gespeichert bei ersten Versuch, den ich gepostet habe.

Ich hoffe es ist ein bischen verständlicher geworden.
Wenn nicht bitte fragen:smile:

Vielen Dank
Richard

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Ich weiß nicht ganz, ob’s Dir hilft, aber hier mal mein Ansatz …

public enum Role {
ROLE_ADMIN, ROLE_CUSTOMER, ROLE_EMPLOYEE
}

Du warst schon fast soweit. Enums sind Klassen, können also auch Attribute und Methode verwenden.

public enum Role {
ROLE_ADMIN(„ROLE_AMDIN“),
ROLE_CUSTOMER(„ROLE_CUSTOMER“),
ROLE_EMPLOYEE(„ROLE_EMPLOYEE“);

private String dbEntry;

private Role(String dbEntry) {
this.dbEntry = dbEntry;
}

public String getDBEntry() {
return dbEntry;
}
}

Bei weiteren Fragen, her damit :wink:

Gruß
Jens