2010-06-15 5 views
16

Tôi đang cố gắng để tồn tại các lớp sau đây với OrmLite:Có thể có một trường enum trong một lớp tồn tại với OrmLite không?

public class Field { 
    @DatabaseField(id = true) 
    public String name; 

    @DatabaseField(canBeNull = false) 
    public FieldType type; 
    ... 
} 

Các FieldType là một public enum. Trường, tương ứng với type là chuỗi trong SQLite (không hỗ trợ enums). Khi tôi cố gắng sử dụng nó, tôi nhận được ngoại lệ sau đây:

INFO [main] (SingleConnectionDataSource.java:244) - Established shared JDBC Connection: [email protected] 
Exception in thread "main" org.springframework.beans.factory.BeanInitializationException: Initialization of DAO failed; nested exception is java.lang.IllegalArgumentException: Unknown field class class enums.FieldType for field FieldType:name=type,class=class orm.Field 
at org.springframework.dao.support.DaoSupport.afterPropertiesSet(DaoSupport.java:51) 
at orm.FieldDAO.getInstance(FieldDAO.java:17) 
at orm.Field.fromString(Field.java:23) 
at orm.Field.main(Field.java:38) 
Caused by: java.lang.IllegalArgumentException: Unknown field class class enums.FieldType for field FieldType:name=type,class=class orm.Field 
at com.j256.ormlite.field.FieldType.<init>(FieldType.java:54) 
at com.j256.ormlite.field.FieldType.createFieldType(FieldType.java:381) 
at com.j256.ormlite.table.DatabaseTableConfig.fromClass(DatabaseTableConfig.java:82) 
at com.j256.ormlite.dao.BaseJdbcDao.initDao(BaseJdbcDao.java:116) 
at org.springframework.dao.support.DaoSupport.afterPropertiesSet(DaoSupport.java:48) 
... 3 more 

Vậy làm thế nào để tôi nói với OrmLite, các giá trị ở bên Java là từ một enum?

Trả lời

39

ORMLite có thể tồn tại sự đếm hoặc là VARCHAR enum name (default):

// this saves it as a string in the database 
@DatabaseField 
OurEnum ourEnum; 
... 
private enum OurEnum { 
    FIRST, 
    SECOND, ; 
} 

Là một thay thế, bạn có thể lưu ordinal INTEGER.

// this saves it as an integer in the database 
@DatabaseField(dataType = DataType.ENUM_INTEGER) 
OurEnum ourEnum; 

Mặc dù bạn có thể cửa hàng thứ tự, phiên bản VARCHAR tên (đó là mặc định) được khuyến khích vì giá trị thứ có thể thay đổi nếu bạn thêm hoặc loại bỏ đi từ enum.

Đối với cả hai loại enum, bạn có thể chỉ định unknownEnumName = "..." field giúp khả năng tương thích về phía trước và ngược. Nếu cơ sở dữ liệu chứa một giá trị không xác định cho enum thì đối tượng được trả về bởi các DAO sẽ có giá trị enum này.

@DatabaseField(unknownEnumName = "FIRST") 
OurEnum ourEnum; 
+1

Cảm ơn, bạn đang làm rất tốt, bạn có nghĩ sẽ tốt hơn khi liên hệ với bạn qua biểu mẫu hoặc trang web này không? Tôi đoán sau này có thể tiết kiệm thời gian của bạn khi mọi người google cho những gì họ muốn đầu tiên – htf

+0

Tại sao nó được khuyến khích sử dụng ENUM_INTEGER? Chắc chắn, tên của mục nhập enum ít có khả năng thay đổi hơn so với thứ tự hoặc số lượng mục nhập. – pablisco

+0

Nó không được khuyến cáo. Bạn đã đọc câu trả lời @pablisco chưa? – Gray