From 1c7bcdebc75f6f8aced304f522a96bc6a8bcc819 Mon Sep 17 00:00:00 2001 From: redkale Date: Fri, 22 Sep 2023 23:29:55 +0800 Subject: [PATCH] diect --- .../java/org/redkale/persistence/Cacheable.java | 6 +++++- .../java/org/redkale/source/EntityCache.java | 17 ++++++++++++++--- .../java/org/redkale/source/EntityInfo.java | 2 +- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/redkale/persistence/Cacheable.java b/src/main/java/org/redkale/persistence/Cacheable.java index d0f2e00d8..c10b8f8dd 100644 --- a/src/main/java/org/redkale/persistence/Cacheable.java +++ b/src/main/java/org/redkale/persistence/Cacheable.java @@ -51,7 +51,11 @@ public @interface Cacheable { */ int interval() default 0; - @Deprecated + /** + * (Optional) DataSource是否直接返回对象的真实引用, 而不是copy一份 + * + * @return boolean + */ boolean direct() default false; @Deprecated diff --git a/src/main/java/org/redkale/source/EntityCache.java b/src/main/java/org/redkale/source/EntityCache.java index 858324f1e..24aa33028 100644 --- a/src/main/java/org/redkale/source/EntityCache.java +++ b/src/main/java/org/redkale/source/EntityCache.java @@ -81,17 +81,28 @@ public final class EntityCache { private CompletableFuture> loadFuture; public EntityCache(final EntityInfo info, final Cacheable c) { - this(info, c != null ? c.interval() : 0); + this(info, c != null ? c.interval() : 0, c != null && c.direct()); } - EntityCache(final EntityInfo info, final int cacheInterval) { + EntityCache(final EntityInfo info, final int cacheInterval, final boolean cacheDirect) { this.info = info; this.interval = cacheInterval < 0 ? 0 : cacheInterval; this.type = info.getType(); this.arrayer = info.getArrayer(); this.creator = info.getCreator(); this.primary = info.primary; - this.needCopy = true; + org.redkale.persistence.VirtualEntity ve = info.getType().getAnnotation(org.redkale.persistence.VirtualEntity.class); + boolean direct = cacheDirect; + if (!direct) { + direct = ve != null && ve.direct(); + } + { //兼容废弃类 + org.redkale.source.VirtualEntity ve2 = info.getType().getAnnotation(org.redkale.source.VirtualEntity.class); + if (!direct && ve2 != null) { + direct = ve2.direct(); + } + } + this.needCopy = !direct; this.newCopier = Copier.create(type, type, (e, c) -> { try { return e.getAnnotation(Transient.class) == null && e.getAnnotation(javax.persistence.Transient.class) == null; diff --git a/src/main/java/org/redkale/source/EntityInfo.java b/src/main/java/org/redkale/source/EntityInfo.java index e444630bf..f5d132535 100644 --- a/src/main/java/org/redkale/source/EntityInfo.java +++ b/src/main/java/org/redkale/source/EntityInfo.java @@ -687,7 +687,7 @@ public final class EntityInfo { Cacheable c1 = type.getAnnotation(Cacheable.class); javax.persistence.Cacheable c2 = type.getAnnotation(javax.persistence.Cacheable.class); if (this.table == null || (!cacheForbidden && c1 != null && c1.value()) || (!cacheForbidden && c2 != null && c2.value())) { - this.cache = new EntityCache<>(this, c1 == null ? (c2 == null ? 0 : c2.interval()) : c1.interval()); + this.cache = new EntityCache<>(this, c1 == null ? (c2 == null ? 0 : c2.interval()) : c1.interval(), c1 == null ? (c2 == null ? false : c2.direct()) : c1.direct()); } else { this.cache = null; }