2013-05-08 2 views
0

이제는이 작업을 수행하는 데 몇 시간의 시간을 낭비했지만 최대 절전 모드에서는 계속 내부에서 무슨 일이 일어나는지 궁금해합니다.ClassCastException 최대 절전 모드에서 지속 열거 형을 사용하는 경우

@LazyCollection(LazyCollectionOption.FALSE) 
@ElementCollection(targetClass=Role.class) 
@JoinTable(name = "userroles", joinColumns = @JoinColumn(name = "userId")) 
@Enumerated(EnumType.ORDINAL) 
private List<Role> roles; 

enum 클래스 :

public enum Role implements Serializable { 
    employee("Mitarbeiter"), 
    manager("Geschäftsleitung"), 
    stationleader("Stationsleitung"), 
    administration("Verwaltung"), 
    accountant("Buchhaltung"); 
@Transient 
private String description; 

private Role() 
{ 

} 

public void setDescription(String description) { 
    this.description = description; 
} 

private Role(String desc) { 
    this.description = desc; 
} 

@Override 
public String toString() { 
    return description; 
} 

public String getDescription() { 
    return description; 
} 
} 

I가 발생하고있어 오류가 발생합니다
은 간단히 다음과 같습니다 @Enumerated를 통해 Listenum의의를 지속 :
여기에 내가하고 싶은거야 List을 잡고있는 클래스의 단순한 persist()입니다. 그 근본 원인은 다음과 같습니다.

Caused by: java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Enum 
at org.hibernate.type.EnumType.nullSafeSet(EnumType.java:118) [hibernate-core-4.0.1.Final.jar:4.0.1.Final] 
at org.hibernate.type.CustomType.nullSafeSet(CustomType.java:155) [hibernate-core-4.0.1.Final.jar:4.0.1.Final] 
at org.hibernate.persister.collection.AbstractCollectionPersister.writeElement(AbstractCollectionPersister.java:811) [hibernate-core-4.0.1.Final.jar:4.0.1.Final] 
at org.hibernate.persister.collection.AbstractCollectionPersister.recreate(AbstractCollectionPersister.java:1201) [hibernate-core-4.0.1.Final.jar:4.0.1.Final] 
at org.hibernate.action.internal.CollectionRecreateAction.execute(CollectionRecreateAction.java:58) [hibernate-core-4.0.1.Final.jar:4.0.1.Final] 
at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:272) [hibernate-core-4.0.1.Final.jar:4.0.1.Final] 
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:264) [hibernate-core-4.0.1.Final.jar:4.0.1.Final] 
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:190) [hibernate-core-4.0.1.Final.jar:4.0.1.Final] 
at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:326) [hibernate-core-4.0.1.Final.jar:4.0.1.Final] 
at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:52) [hibernate-core-4.0.1.Final.jar:4.0.1.Final] 
at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1081) [hibernate-core-4.0.1.Final.jar:4.0.1.Final] 
at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:315) [hibernate-core-4.0.1.Final.jar:4.0.1.Final] 
at org.hibernate.engine.transaction.synchronization.internal.SynchronizationCallbackCoordinatorImpl.beforeCompletion(SynchronizationCallbackCoordinatorImpl.java:104) [hibernate-core-4.0.1.Final.jar:4.0.1.Final] 

어떻게 해결할 수 있습니까? 이것에 대한 알려진 버그가없는 것 같으며 여러 포럼에서 비 응답 스레드를 발견했습니다. 또한, 비록 효과없이, EnumType.STRING 및 주석의 일부를 떠나 시도 :/
편집 : 가 나는 또한 단지 표준 생성자없이 필드 값 아무것도하지만 원시 enum을 사용했습니다. 그래서 오류가 내 enum-pojo에 있지 않아야합니다.
EDIT2 :
내 문제는 다른 곳에서 거짓말을했습니다. (JSF and type safety). 올바른 방향 : 당신의 열거로

+0

열거 형 이름을 대문자로 변환 해보십시오. 그래도 도움이되지 않으면 로거 수준을 TRACE로 설정하고 여기에 로그를 게시하십시오. –

+0

@MarlonBernardes 대문자로 변환해도 아무 것도 변경되지 않았습니다. 그것은 또한'Logger log = Logger.getLogger ("org.hibernate.SQL"); log.setLevel (Level.TRACE); '이전보다 많은 로그 항목이 표시되지 않습니다. (1 Info) – Zhedar

+0

"org.hibernate.SQL"대신 "org.hibernate.type"을 사용하십시오. 수동으로 설정하지 마십시오. 응용 프로그램을 시작하기 전에 구성해야합니다 (예 : log4j.properties -> log4j.logger.org.hibernate.type = TRACE) –

답변

1

나를 밀어 방법 그러나 나는 대답을 받아 사용자가 일부 옵션이 속성이 있습니다

  1. 다음과 같이 정의 유형 (UserType을) 만들기 : https://community.jboss.org/wiki/UserTypeforpersistingaTypesafeEnumerationwithaVARCHARcolumn
  2. Transient로 Enum 속성을 만들고 String getter 및 setter를 채 웁니다.
+0

나는 이미 그것을 시도했습니다. 나는 그것을 아래의 절에서 설명하기를 원했다. 하지만 이제는 ORDINAL도 거기에 썼습니다./ 사실 제가 시도한 것은 '문자열'입니다. – Zhedar

+0

String을 사용할 때 어떤 예외가 있습니까? –

+0

모두 같습니다. – Zhedar

관련 문제