2012-10-17 50 views
0

我嘗試使用UUID字段映射類時發生以下異常。類似日期的字段也是如此。 我的實體需要具有這些值的字段,可能的解決方案是什麼?是否支持將UUID作爲playORM的ID類型?

java.lang.RuntimeException: Failure scanning class(see chained exception)=class com.s1mbi0se.dmp.da.bean.User 
    at com.alvazan.orm.layer0.base.MyClassAnnotationDiscoveryListener.scanClass(MyClassAnnotationDiscoveryListener.java:44) 
    at com.alvazan.orm.layer0.base.BaseEntityManagerFactoryImpl.rescan(BaseEntityManagerFactoryImpl.java:83) 
    at com.alvazan.orm.layer0.base.BaseEntityManagerFactoryImpl.setup(BaseEntityManagerFactoryImpl.java:131) 
    at com.alvazan.orm.impl.bindings.BootstrapImpl.createInstance(BootstrapImpl.java:51) 
    at com.alvazan.orm.api.base.Bootstrap.create(Bootstrap.java:53) 
    at com.alvazan.orm.api.base.Bootstrap.create(Bootstrap.java:48) 
    at com.alvazan.orm.api.base.Bootstrap.create(Bootstrap.java:45) 
    at com.alvazan.orm.api.base.Bootstrap.create(Bootstrap.java:41) 
    at com.s1mbi0se.dmp.da.dao.PlayOrmConfiguration.init(PlayOrmConfiguration.java:39) 
    at com.s1mbi0se.dmp.da.dao.TestUserDao.testUserOperations(TestUserDao.java:18) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42) 
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) 
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:300) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 
Caused by: java.lang.RuntimeException: Failure scanning field=private java.util.Date com.s1mbi0se.dmp.da.bean.User.birthDate for class=User 
    at com.alvazan.orm.impl.meta.scan.ScannerForClass.inspectField(ScannerForClass.java:179) 
    at com.alvazan.orm.impl.meta.scan.ScannerForClass.scanFields(ScannerForClass.java:172) 
    at com.alvazan.orm.impl.meta.scan.ScannerForClass.scanSingle(ScannerForClass.java:111) 
    at com.alvazan.orm.impl.meta.scan.ScannerForClass.addClass(ScannerForClass.java:67) 
    at com.alvazan.orm.layer0.base.MyClassAnnotationDiscoveryListener.scanClass(MyClassAnnotationDiscoveryListener.java:42) 
    ... 32 more 
Caused by: java.lang.IllegalArgumentException: No converter found for field='birthDate' in class=class com.s1mbi0se.dmp.da.bean.User. You need to either add one of the @*ToOne annotations, @Embedded, @Transient or add your own converter calling EntityMgrFactory.setup(Map<Class, Converter>) which will then work for all fields of that type OR add @Column(customConverter=YourConverter.class) or finally if we missed a standard converter, we need to add it in file InspectorField.java in the constructor and it is trivial code(and we can copy the existing pattern) 
    at com.alvazan.orm.impl.meta.scan.ScannerForField.processColumn(ScannerForField.java:173) 
    at com.alvazan.orm.impl.meta.scan.ScannerForClass.inspectFieldImpl(ScannerForClass.java:205) 
    at com.alvazan.orm.impl.meta.scan.ScannerForClass.inspectField(ScannerForClass.java:177) 
    ... 36 more 

回答

1

對於日期,我們使用joda時間作爲日期和日曆是非常錯誤的。 Jdk7本應該整合joda時間,因爲它修復了所有的bug。您可以使用LocalDate和LocalDateTime等。

對於任何您可以添加自己的轉換器。當您通過引導首次創建NoSqlEntityManagerFactory,有一個地圖

public synchronized static NoSqlEntityManagerFactory create(DbTypeEnum type, Map<String, Object> properties, Map<Class, Converter> converters, ClassLoader cl) 

重要的地圖填寫有

Map<Class, Converter> converters 

您可以提供類= Date.class和轉換器= new YourConverterForDate()

您也可以爲UUID提供一個。如果我們不在轉換器的標準映射中找到轉換器,則使用此轉換器映射。同時,爲Date和TimeUUID打開兩個問題,我將添加這些問題。另外,請注意java的TimeUUID,因爲它不是X類型的(我不記得X是否應該是1或4),並且它不是唯一的:(.....有另一個Java庫創建唯一的TimeUUID在網絡上....我可以稍後當我有更多的時間。

院長

+0

非常感謝,還會再提出兩個問題,並嘗試瞭解更多關於這些轉換器的知識,但是我對這次UUID的事情不甚瞭解......我們通過使用Astyanax類UUIDSerial來生成UUID我們可以在這種情況下遇到問題嗎? – mvallebr

+0

Astyanax序列化程序非常適合序列化/反序列化UUID,但它又是java中的java.util.UUID,它是4型UUID,它是隨機的,如果你有數以萬億計的行,你將有1個或2個重複調試)。我更喜歡使用保證的唯一ID,所以我不會在萬億行中有1或2個。 –

相關問題