Tohle je potřeba, pokud máte čísleník v databázi a položky v Enum se
vám nesmějí přeházet. Jinak Enum samotné už číslované je, viz právě
ordinal(). Problém s persistencí je ten, že je číslované podle pořadí
v kódu (jak taky jinak), takže když změnite pořadí položek (třeba v
eclipse dáte sort :-) změní se i čísla položek.
Filip Jirsák
2005/11/8, Martin Bednář <[EMAIL PROTECTED]>:
> Pouzivam toto z konference EJB3 na jboss.org:
>
> dsouza,
>
> The bug has been resolved (not yet solved), so i would expect that a
> sollution is provided within the next week.
>
> I've done the following work arround so that i can still use Enums:
>
> I've added a constructor to te enum wich can contain a int value :
>
>
> | public enum Scope implements Serializable {
> |
> | PUBLIC(0),
> | PROTECTED(1),
> | PRIVATE(2);
> |
> | private int type = 0;
> |
> | private Scope(int type) {
> | this.type = type;
> | }
> |
> | public int getType() {
> | return type;
> | }
> |
> | }
> |
>
> And i made the following changes to the entity:
>
> I've made the get/set method with the enum @Transient so that it is not
> stored in the database. Then i created a new set of get/set methods:
>
>
> | public class MyEntity implements java.io.Serializable {
> |
> | private Scope scope = Scope.PUBLIC;
> |
> | ...
> |
> | public void setScopeType(int scopeType) {
> | for (Scope scope : Scope.values()) {
> | if (scope.getType() == scopeType) {
> | this.scope = scope;
> | return;
> | }
> | }
> |
> | throw new IllegalArgumentException("ScopeType is not
> valid.");
> | }
> |
> | @Column(name="scope", nullable=false)
> | public int getScopeType() {
> | return scope.getType();
> | }
> | }
> |
>
> So in my code i still use the enums but for storage i use the type value of
> the enum. If this bug is solved i only have to remove the added get/set
> method and remove the @Transient annotation.
>
>
>
> View the original post :
> http://www.jboss.org/index.html?module=bb&op=viewtopic&p=3884826#3884826
>
> Reply to the post :
> http://www.jboss.org/index.html?module=bb&op=posting&mode=reply&p=3884826
>
>
>
> Ondřej Fafejta KYBERIE napsal(a):
> Zdravím konferenci!
>
> Mám tento výčtový typ:
>
> public enum FolderEnum {
> INBOX, SENT, TRASH, SPAM
> }
>
> Dále mám entitu EmailMessage, která obsahuje položku FolderEnum.
> Do databáze se výčtový typ mapuje jako int.
> Pokud načtu celý email, tak automaticky se mi převede int na FolderEnum.
>
> Vše fungovalo výborně až do té doby, kdy jsem potřeboval vyhledat
> všechny SPAMY.
>
> Query query = em.createQuery("SELECT em FROM EmailMessage em WHERE
> em.folder=:folder");
> query.setParameter("folder",FolderEnum.SPAM);
> List<EmailMessage> emails=query.getResultList();
>
> Při metodě setParametr se již nepřevádí FolderEnum.SPAM na int, ale na
> BYTEA.
> Vyhazuje mi to chybu:
> java.sql.SQLException: ERROR: operator does not exist: integer = bytea
>
> Jediné co funguje je toto:
> query.setParameter("folder",3);
>
> Musel bych tedy převádět FolderEnum.SPAM na int ručně, což se mi vůbec
> nelíbí. (resp. udělat převodní tabulku).
> Jiná možnost je místo enum používat konstanty, ale to se mi také nechce
> - myslím si, že enum je elegantnější.
> Zavádět číselník není potřeba, protože více položek nikdy nebude.
>
> Setkal jste se s tím někdo?
> A pokud ano, jak jste to vyřešili?
>
> Díky
> Fafi
>
>
--
Filip Jirsák
[EMAIL PROTECTED]