이제는이 작업을 수행하는 데 몇 시간의 시간을 낭비했지만 최대 절전 모드에서는 계속 내부에서 무슨 일이 일어나는지 궁금해합니다.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
를 통해 List
enum
의의를 지속 :
여기에 내가하고 싶은거야 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). 올바른 방향 : 당신의 열거로
열거 형 이름을 대문자로 변환 해보십시오. 그래도 도움이되지 않으면 로거 수준을 TRACE로 설정하고 여기에 로그를 게시하십시오. –
@MarlonBernardes 대문자로 변환해도 아무 것도 변경되지 않았습니다. 그것은 또한'Logger log = Logger.getLogger ("org.hibernate.SQL"); log.setLevel (Level.TRACE); '이전보다 많은 로그 항목이 표시되지 않습니다. (1 Info) – Zhedar
"org.hibernate.SQL"대신 "org.hibernate.type"을 사용하십시오. 수동으로 설정하지 마십시오. 응용 프로그램을 시작하기 전에 구성해야합니다 (예 : log4j.properties -> log4j.logger.org.hibernate.type = TRACE) –