Skip to content

Commit

Permalink
database-spring-boot-starter 中支持了graalVM的构建, 需要手动在配置类上增加对应的注解, 详见文档
Browse files Browse the repository at this point in the history
  • Loading branch information
xutengx committed Sep 16, 2022
1 parent 2b4e1b7 commit 6957585
Show file tree
Hide file tree
Showing 27 changed files with 346 additions and 89 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ Eloquent ORM for Java
* [查询构造器](/document/query.md)
* [关联关系](/document/relationship.md)
* [生成代码](/document/generate.md)
* [GraalVM](/document/graalvm.md)
* [版本信息](/document/version.md)


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,10 @@ public TypeNotSupportedException() {
super();
}

public TypeNotSupportedException(Class<?> clazz) {
super(clazz.getName());
}

public TypeNotSupportedException(String message) {
super(message);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,7 @@
import gaarason.database.config.ConversionConfig;
import gaarason.database.config.GaarasonAutoconfiguration;
import gaarason.database.config.GaarasonDatabaseProperties;
import gaarason.database.contract.support.IdGenerator;
import gaarason.database.contract.support.ReflectionScan;
import gaarason.database.contract.support.*;
import gaarason.database.exception.TypeCastException;
import gaarason.database.lang.Nullable;
import gaarason.database.logging.Log;
Expand All @@ -16,7 +15,6 @@
import gaarason.database.support.SnowFlakeIdGenerator;
import gaarason.database.util.ClassUtils;
import gaarason.database.util.ConverterUtils;
import gaarason.database.util.ObjectUtils;

import java.lang.reflect.Field;
import java.sql.ResultSet;
Expand Down Expand Up @@ -111,6 +109,13 @@ public ContainerBootstrap defaultRegister() {
// 类型转化
// todo better
register(ConversionConfig.class, clazz -> initConversionConfig());
register(FieldFill.NotFill.class, clazz -> new FieldFill.NotFill());
register(FieldConversion.Default.class, clazz -> new FieldConversion.Default());
register(FieldStrategy.Default.class, clazz -> new FieldStrategy.Default());
register(FieldStrategy.Never.class, clazz -> new FieldStrategy.Never());
register(FieldStrategy.Always.class, clazz -> new FieldStrategy.Always());
register(FieldStrategy.NotNull.class, clazz -> new FieldStrategy.NotNull());
register(FieldStrategy.NotEmpty.class, clazz -> new FieldStrategy.NotEmpty());
// Model的实例化的工厂的提供者
register(ModelInstanceProvider.class, clazz -> new ModelInstanceProvider(this));
// Model信息大全
Expand Down Expand Up @@ -197,7 +202,7 @@ public Object getValueFromJdbcResultSet(@Nullable Field field, ResultSet resultS
*/
protected ModelShadowProvider initModelShadow() {
ModelShadowProvider modelShadowProvider = getBean(ModelShadowProvider.class);
int i = modelShadowProvider.loadModels(ObjectUtils.typeCast(getBean(ReflectionScan.class).scanModels()));
int i = modelShadowProvider.loadModels(getBean(ReflectionScan.class).scanModels());
LOGGER.debug("All " + i + " Model has been load.");
return modelShadowProvider;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -134,12 +134,12 @@ public GaarasonDatabaseProperties mergeScan(GaarasonDatabaseProperties.Scan scan

/**
* 如果Packages为空, 则填充默认值
* @param defaultPackage 默认值
* @param defaultPackages 默认值
* @return GaarasonDatabaseProperties
*/
public GaarasonDatabaseProperties fillPackageWhenIsEmpty(String defaultPackage) {
public GaarasonDatabaseProperties fillPackageWhenIsEmpty(List<String> defaultPackages) {
if (this.getScan().getPackages().isEmpty()) {
this.getScan().getPackages().add(defaultPackage);
this.getScan().getPackages().addAll(defaultPackages);
}
return this;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,19 +7,19 @@
import gaarason.database.contract.eloquent.Record;
import gaarason.database.contract.function.ColumnFunctionalInterface;
import gaarason.database.core.Container;
import gaarason.database.exception.EntityAttributeInvalidException;
import gaarason.database.exception.EntityInvalidException;
import gaarason.database.exception.IllegalAccessRuntimeException;
import gaarason.database.exception.ModelInvalidException;
import gaarason.database.exception.*;
import gaarason.database.lang.Nullable;
import gaarason.database.logging.Log;
import gaarason.database.logging.LogFactory;
import gaarason.database.support.*;
import gaarason.database.util.EntityUtils;
import gaarason.database.util.LambdaUtils;
import gaarason.database.util.ObjectUtils;

import java.io.Serializable;
import java.util.*;
import java.lang.reflect.Modifier;
import java.util.Collection;
import java.util.Collections;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
Expand All @@ -44,23 +44,37 @@ public ModelShadowProvider(Container container) {

/**
* 通过反射等手段, 得到model信息
* @param modelClass model类型
* @return 是否成功
*/
public boolean loadModel(Class<? extends Model<?, ?>> modelClass) {
return loadModels(Collections.singleton(modelClass)) > 0;
}

/**
* 通过反射等手段, 得到model信息
* 因为关联关系的相关功能, 需要将存在关系的都提前准备好, 这样才能通过entity找到对应的model
* @param modelClasses model类型的集合
* @return 数量
*/
public int loadModels(Collection<Class<? extends Model<Serializable, Serializable>>> modelClasses) {
public int loadModels(Collection<Class<? extends Model<?, ?>>> modelClasses) {
synchronized (persistence) {
int i = 0;
// 所有 Model 的子类 (含抽象类等)进行初始化分析
// 初始化模型的基本信息, 并构建索引
for (Class<? extends Model<Serializable, Serializable>> modelClass : modelClasses) {
ModelMember<?, ?> modelMember;
for (Class<? extends Model<?, ?>> modelClass : modelClasses) {
ModelMember<Object, Object> modelMember;
// 接口跳过/抽象类跳过
if (modelClass.isInterface() || Modifier.isAbstract(modelClass.getModifiers())) {
continue;
}
try {
modelMember = new ModelMember<>(container, modelClass);
} catch (ClassCastException ignore) {
// 父类, 抽象类跳过
modelMember = new ModelMember<>(container, ObjectUtils.typeCast(modelClass));
} catch (TypeNotSupportedException | ClassCastException ignore) {
// 类型失败跳过
continue;
}
i ++;
i++;
persistence.modelIndexMap.put(modelClass, modelMember);
persistence.modelProxyIndexMap.put(modelMember.getModel().getClass(), modelMember);
persistence.entityIndexMap.put(modelMember.getEntityClass(), modelMember);
Expand All @@ -74,7 +88,7 @@ public int loadModels(Collection<Class<? extends Model<Serializable, Serializabl
* @param modelClasses model类型的集合
* @return 数量
*/
public int refreshModels(Collection<Class<? extends Model<Serializable, Serializable>>> modelClasses) {
public int refreshModels(Collection<Class<? extends Model<?, ?>>> modelClasses) {
return loadModels(modelClasses);
}

Expand All @@ -83,13 +97,13 @@ public int refreshModels(Collection<Class<? extends Model<Serializable, Serializ
* @param modelClasses model类型的集合
* @return 数量
*/
public int unloadModels(Collection<Class<? extends Model<Serializable, Serializable>>> modelClasses) {
public int unloadModels(Collection<Class<? extends Model<?, ?>>> modelClasses) {
synchronized (persistence) {
int i = 0;
for (Class<? extends Model<Serializable, Serializable>> modelClass : modelClasses) {
for (Class<? extends Model<?, ?>> modelClass : modelClasses) {
ModelMember<?, ?> modelMember = persistence.modelIndexMap.remove(modelClass);
if (!ObjectUtils.isEmpty(modelMember)) {
i ++;
i++;
persistence.entityIndexMap.remove(modelMember.getEntityClass());
persistence.modelProxyIndexMap.entrySet().removeIf(entry -> entry.getValue() == modelMember);
}
Expand All @@ -116,17 +130,28 @@ public <T, K> ModelMember<T, K> get(Model<T, K> model) {
* @param <K> 主键类型
* @return 格式化后的Model信息
*/
public <T, K> ModelMember<T, K> getByModelClass(
Class<? extends Model<T, K>> modelClass) {
ModelMember<?, ?> result1 = persistence.modelProxyIndexMap.get(modelClass);
if (null == result1) {
ModelMember<?, ?> result2 = persistence.modelIndexMap.get(modelClass);
if (null == result2) {
throw new ModelInvalidException(modelClass);
public <T, K> ModelMember<T, K> getByModelClass(Class<? extends Model<T, K>> modelClass) {
ModelMember<?, ?> result;
result = persistence.modelProxyIndexMap.get(modelClass);
if (null == result) {
result = persistence.modelIndexMap.get(modelClass);
if (null == result) {
/*
* 尝试动态解析一次
*/
if (loadModel(modelClass)) {
result = persistence.modelProxyIndexMap.get(modelClass);
if (null == result) {
result = persistence.modelIndexMap.get(modelClass);
}
}
}
return ObjectUtils.typeCast(result2);
}
return ObjectUtils.typeCast(result1);

if (null == result) {
throw new ModelInvalidException(modelClass);
}
return ObjectUtils.typeCast(result);
}

/**
Expand All @@ -135,7 +160,23 @@ public <T, K> ModelMember<T, K> getByModelClass(
* @return 格式化后的Model信息
*/
public <T> ModelMember<? super T, ?> getByEntityClass(Class<T> clazz) {
ModelMember<?, ?> result = persistence.entityIndexMap.get(clazz);
ModelMember<?, ?> result;

result = persistence.entityIndexMap.get(clazz);
if (null == result) {
/*
* 尝试动态解析一次
* 仅对, model是其entity的内部类的情况有效, 其他情况下没有办法找(猜测)到对应的model
* class SomeEntity {
* public static class Model implements Model<SomeEntity, K> {}
* }
*/
Class<? extends Model<?, ?>> modelClass = EntityUtils.inferModelClassOnEntity(clazz);
// 似乎找到了
if (modelClass != null && loadModel(modelClass)) {
result = persistence.entityIndexMap.get(clazz);
}
}
if (null == result) {
throw new EntityInvalidException(clazz);
}
Expand Down Expand Up @@ -246,20 +287,20 @@ private <T> String parseLambda(ColumnFunctionalInterface<T> func) {

/**
* 查询entity 中的指定字段信息
* @param entityClass 实体类(可查找泛型)
* @param anyEntityClass 实体类(可查找泛型)
* @param fieldName 实体中的属性
* @param <T> 实体类型
* @return 字段信息
* @throws EntityAttributeInvalidException 无效的字段
*/
public <T> FieldMember getFieldByAnyEntityClass(Class<T> entityClass, String fieldName)
public <T> FieldMember getFieldByAnyEntityClass(Class<T> anyEntityClass, String fieldName)
throws EntityAttributeInvalidException, EntityInvalidException {

// 字段信息
FieldMember fieldMember = parseAnyEntityWithCache(entityClass).getJavaFieldMap().get(fieldName);
FieldMember fieldMember = parseAnyEntityWithCache(anyEntityClass).getJavaFieldMap().get(fieldName);

if (ObjectUtils.isEmpty(fieldMember)) {
throw new EntityAttributeInvalidException(fieldName, entityClass);
throw new EntityAttributeInvalidException(fieldName, anyEntityClass);
}
return fieldMember;
}
Expand Down Expand Up @@ -347,8 +388,8 @@ public <T, K> void setPrimaryKeyValue(T anyEntity, @Nullable K id) {
*/
@Nullable
public <T, K> K getPrimaryKeyValue(T anyEntity, EntityUseType type) {
Object primaryKeyValue = parseAnyEntityWithCache(anyEntity.getClass())
.getPrimaryKeyMemberOrFail().getFieldMember()
Object primaryKeyValue = parseAnyEntityWithCache(anyEntity.getClass()).getPrimaryKeyMemberOrFail()
.getFieldMember()
.fieldGetOrFail(anyEntity, type);
return primaryKeyValue == null ? null : ObjectUtils.typeCast(primaryKeyValue);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,10 +86,10 @@ public List<T> toObjectList(Map<String, RecordList<?, ?>> cacheRecords) {
ModelMember<T, K> modelMember = modelShadow.get(records.get(0).getModel());
EntityMember<T> entityMember = modelMember.getEntityMember();

// 实体类的对象
// 实体类的对象 (仅包含数据库字段属性)
T entity = modelShadow.entityAssignment(entityMember.getEntityClass(), theRecord);

// 关系属性集合
// 关联关系属性集合
Map<String, FieldRelationMember> relationFieldMap = entityMember.getRelationFieldMap();
for (Map.Entry<String, FieldRelationMember> entry : relationFieldMap.entrySet()) {
// 关系属性信息
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,15 @@
import gaarason.database.annotation.Column;
import gaarason.database.annotation.Table;
import gaarason.database.appointment.FinalVariable;
import gaarason.database.contract.eloquent.Model;
import gaarason.database.exception.IllegalAccessRuntimeException;
import gaarason.database.exception.TypeNotSupportedException;
import gaarason.database.lang.Nullable;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
Expand Down Expand Up @@ -162,4 +165,32 @@ public static Field getDeclaredFieldContainParent(Class<?> clazz, String name) t
}
}

/**
* 尝试在entity的内部类中, 找到其对应的model
* @param anyEntityClass 实体类
* @return model类
*/
@Nullable
public static Class<? extends Model<?, ?>> inferModelClassOnEntity(Class<?> anyEntityClass) {
// 所有内部类
for (Class<?> maybeModelClass : anyEntityClass.getDeclaredClasses()) {
// 是否是 Model
if (Model.class.isAssignableFrom(maybeModelClass)) {
/*
* 进一步检查 Entity
* 不是抽象类, 且泛型参数正确
*/
if (!Modifier.isAbstract(maybeModelClass.getModifiers())) {
try {
if (anyEntityClass.equals(ObjectUtils.getGenerics(maybeModelClass, 0))) {
return ObjectUtils.typeCast(maybeModelClass);
}
} catch (Throwable ignore) {
}
}
}
}
return null;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -31,19 +31,39 @@ public class ObjectUtils {
private ObjectUtils() {
}


/**
* 获取指定类中的第index个泛型的类
* @param clazz 指定类
* @param index 第几个
* @param <A> 泛型的类
* @param <B> 指定类型
* @return 泛型的类
* @throws TypeNotSupportedException 不支持的类型
*/
@SuppressWarnings("unchecked")
public static <A, B> Class<A> getGenerics(Class<B> clazz, int index) {
return (Class<A>) ((ParameterizedType) clazz.getGenericSuperclass())
.getActualTypeArguments()[index];
public static <A, B> Class<A> getGenerics(Class<B> clazz, int index) throws TypeNotSupportedException {
ParameterizedType parameterizedType = getParameterizedType(clazz);
if (null == parameterizedType) {
throw new TypeNotSupportedException(clazz);
}
return (Class<A>) parameterizedType.getActualTypeArguments()[index];
}

/**
* 反射泛型参数
* @param clazz 指定类
* @return ParameterizedType
*/
@Nullable
protected static ParameterizedType getParameterizedType(Class<?> clazz) {
Type type = clazz.getGenericSuperclass();
if (type instanceof Class) {
return getParameterizedType((Class<?>) type);
} else if (type instanceof ParameterizedType) {
return (ParameterizedType) type;
} else {
return null;
}
}

/**
Expand Down
4 changes: 2 additions & 2 deletions database-spring-boot-starter/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,10 @@

<properties>
<java.version>1.8</java.version>
<gaarason.database.springboot.version>2.6.7</gaarason.database.springboot.version>
<gaarason.database.druid.version>1.2.9</gaarason.database.druid.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<gaarason.database.springboot.version>2.7.3</gaarason.database.springboot.version>
<gaarason.database.druid.version>1.2.9</gaarason.database.druid.version>
</properties>

<dependencyManagement>
Expand Down
Loading

0 comments on commit 6957585

Please sign in to comment.