gpt4 book ai didi

java - Ormlite:使用泛型作为 id 的类型

转载 作者:行者123 更新时间:2023-12-01 15:28:42 25 4
gpt4 key购买 nike

我正在使用 ormlite 在 java 中进行数据库交互。工作正常。

现在我想创建一个通用实体类。也许我会先用一些代码来解释它。

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);
}

}

没用...当然..

有谁知道如何解决这个问题吗?谢谢!

最佳答案

因此,考虑到您的层次结构, ORMLite当需要从关联的数据库字段创建抽象类的实例时,就会遇到问题。这就是sqlArgToJava 方法正在尝试做的事情。以DATE_LONG类型为例,日期在数据库中存储为长时间毫秒,因此sqlArgToJava方法为:

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

显然没有办法创建AbstractId的实例。您将必须为每个子类创建一个持久化器。

如果您擅长反射(reflection),那么您可以执行以下操作,但这肯定是一种黑客行为。我认为为每个具体类创建一个持久化器是正确的方法。

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);
}

关于java - Ormlite:使用泛型作为 id 的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9843203/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com