2012-03-23 25 views
0

我在java中使用ormlite进行数据库交互。工作正常。Ormlite:使用泛型作为id的类型

现在我想创建一个通用的实体类。也许我会从一些代码开始解释它。

AbstractId有点象一个基类的所有ID:

public abstract class AbstractId { 
    public AbstractId(String id) { 
     this.id = id;  
    } 

    public String value() { 
     return this.id; 
    } 
} 

扩展到:

public class SampleId extends AbstractId { 
     public SampleId(String id) { 
      super(id); 
     } 
    } 

现在我有一个抽象的基础机构,以节省一些打字;)

public abstract class AbstractEntity<T> { 

    @DatabaseField(id = true, columnName = "id") 
    private T  id; 

    @DatabaseField(columnName = "name", canBeNull = false) 
    private String name; 

    public AbstractEntity() { 
    } 
} 

它由一个样本实体扩展:

@DatabaseTable(tableName = "sample") 
public class SampleEntity<T extends AbstractId> extends AbstractEntity<T> { 

    @DatabaseField(canBeNull = false, columnName = "key") 
    private String otherValue; 

    public SampleEntity() { 
    } 
} 

那么我该如何坚持T?实体实例由

SampleEntity<SampleId> entity = new SampleEntity<>() // (*) 

我试图创建一个新的BaseDataType并设置DatabaseField创建以此为persisterClass:

public class AbstractIdPersister extends BaseDataType { 

    public AbstractIdPersister(SqlType sqlType, Class<?>[] classes) { 
     super(sqlType, classes); 
    } 

    @Override 
    public Object parseDefaultString(FieldType fieldType, String defaultStr) 
      throws SQLException { 
     return null; 
    } 

    @Override 
    public Object javaToSqlArg(FieldType fieldType, Object obj) { 
     AbstractId abstractId = (AbstractId) obj; 
     return abstractId.value(); 
    } 

    @Override 
    public Object sqlArgToJava(FieldType fieldType, Object sqlArg, int columnPos) 
      throws SQLException {    
     // HOW DO I GET THE GENERIC TYPE DEFINED ABOVE (*)  
    } 

    @Override 
    public Object resultToSqlArg(FieldType fieldType, DatabaseResults results, 
      int columnPos) throws SQLException { 
     return results.getString(columnPos); 
    } 

} 

没有工作......当然..

有没有人有任何想法如何解决这个问题?谢谢!

回答

1

因此,给定您的层次结构时,ORMLite将需要从关联的数据库字段中创建抽象类的实例时遇到问题。这就是sqlArgToJava方法试图去做的。在DATE_LONG类型,例如,日期被存储在数据库中作为时间长毫秒,所以sqlArgToJava方法是:

public Object sqlArgToJava(FieldType fieldType, Object sqlArg, int columnPos) { 
    // create a Date object 
    return new Date((Long) sqlArg); 
} 

显然也没有办法来创建的AbstractId一个实例。相反,您将不得不为每个子类创建一个持久存储器。

如果你对反射很好,那么你可能会做下面的事情,但它肯定是黑客。我认为为你的每一个具体的课程创造一个持久教徒是一条路。

try { 
    // find the type of the field, and look for a String constructor 
    return fieldType.getType().getConstructor(String.class).newInstance(sqlArg); 
} catch (Exception e) { 
    throw SqlExceptionUtil.create("could not call the string constructor on " 
     + fieldType.getType(), e); 
} 
+0

灰色 请建议为https://stackoverflow.com/questions/45989326/create-databasefield-with-generic-type-as-a-foreign-key-relation-in-ormlite某种方式 – 2017-09-01 21:14:57