From 83c978e4838bd3c3bd92ad6c38703c2be1749ecd Mon Sep 17 00:00:00 2001 From: awake Date: Thu, 23 May 2024 16:36:36 +0800 Subject: [PATCH] feat[orm]: add loadAndInit method --- .../java/com/zfoo/orm/cache/EntityCache.java | 23 +++++++++++++++++++ .../java/com/zfoo/orm/cache/IEntityCache.java | 8 +++++++ .../main/java/com/zfoo/orm/model/IEntity.java | 5 +++- .../java/com/zfoo/orm/cache/EmailManager.java | 16 +++++++++++++ .../com/zfoo/orm/cache/EntityCachesTest.java | 19 +++++++++++++++ .../java/com/zfoo/orm/entity/UserEntity.java | 5 ++++ .../com/zfoo/orm/entity/bag/MapEntity.java | 5 ++++ 7 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 orm/src/test/java/com/zfoo/orm/cache/EmailManager.java diff --git a/orm/src/main/java/com/zfoo/orm/cache/EntityCache.java b/orm/src/main/java/com/zfoo/orm/cache/EntityCache.java index 9416af25..d33a93ad 100644 --- a/orm/src/main/java/com/zfoo/orm/cache/EntityCache.java +++ b/orm/src/main/java/com/zfoo/orm/cache/EntityCache.java @@ -129,6 +129,29 @@ public class EntityCache, E extends IEntity> imple return entity; } + @Override + public E loadOrInit(PK pk) { + AssertionUtils.notNull(pk); + var pnode = cache.get(pk); + if (pnode != null) { + return pnode.getEntity(); + } + + @SuppressWarnings("unchecked") + var entity = (E) OrmContext.getAccessor().load(pk, (Class>) entityDef.getClazz()); + + // 如果数据库中不存在则给一个默认值 + if (entity == null) { + // 数据库无法加载缓存,返回默认值 + entity = (E) entityDef.newEntity(pk); + entity.setId(pk); + OrmContext.getAccessor().insert(entity); + } + pnode = new PNode<>(entity); + cache.put(pk, pnode); + return entity; + } + /** * 校验需要更新的entity和缓存的entity是否为同一个entity */ diff --git a/orm/src/main/java/com/zfoo/orm/cache/IEntityCache.java b/orm/src/main/java/com/zfoo/orm/cache/IEntityCache.java index 5796b301..4d75dc5d 100644 --- a/orm/src/main/java/com/zfoo/orm/cache/IEntityCache.java +++ b/orm/src/main/java/com/zfoo/orm/cache/IEntityCache.java @@ -29,6 +29,14 @@ public interface IEntityCache, E extends IEntity> */ E load(PK pk); + /** + * EN: Load data from the database into the cache, and if the database does not exist, + * return a default example with the id as the passed in value. And put it into storage. + *

+ * CN: 从数据库中加载数据到缓存,如果数据库不存在则返回一个id为传入值的默认示例。并且入库。(设置了索引唯一的无法使用该方法) + */ + E loadOrInit(PK pk); + /** * 更新缓存中的数据,只更新缓存的时间戳,并通过一定策略写入到数据库 *

diff --git a/orm/src/main/java/com/zfoo/orm/model/IEntity.java b/orm/src/main/java/com/zfoo/orm/model/IEntity.java index 59b532fe..7b4bf5c7 100644 --- a/orm/src/main/java/com/zfoo/orm/model/IEntity.java +++ b/orm/src/main/java/com/zfoo/orm/model/IEntity.java @@ -24,7 +24,10 @@ public interface IEntity> { */ PK id(); - + /** + * 设置主键 + */ + void setId(PK pk); /** * 一个文档的写入到数据库的version版本,version的get和set方法 *

diff --git a/orm/src/test/java/com/zfoo/orm/cache/EmailManager.java b/orm/src/test/java/com/zfoo/orm/cache/EmailManager.java new file mode 100644 index 00000000..570e0ea6 --- /dev/null +++ b/orm/src/test/java/com/zfoo/orm/cache/EmailManager.java @@ -0,0 +1,16 @@ +package com.zfoo.orm.cache; + +import com.zfoo.orm.anno.EntityCacheAutowired; +import com.zfoo.orm.entity.MailEntity; +import org.springframework.stereotype.Component; + +/** + * @Author:awakeyoyoyo + * @Date:2024/5/23 16:32 + */ +@Component +public class EmailManager { + + @EntityCacheAutowired + public IEntityCache mailEntityCaches; +} diff --git a/orm/src/test/java/com/zfoo/orm/cache/EntityCachesTest.java b/orm/src/test/java/com/zfoo/orm/cache/EntityCachesTest.java index c7a04030..81d989f9 100644 --- a/orm/src/test/java/com/zfoo/orm/cache/EntityCachesTest.java +++ b/orm/src/test/java/com/zfoo/orm/cache/EntityCachesTest.java @@ -15,6 +15,7 @@ package com.zfoo.orm.cache; import com.mongodb.client.model.Filters; import com.zfoo.orm.OrmContext; +import com.zfoo.orm.entity.MailEntity; import com.zfoo.orm.entity.UserEntity; import com.zfoo.protocol.util.ThreadUtils; import com.zfoo.scheduler.util.TimeUtils; @@ -51,6 +52,24 @@ public class EntityCachesTest { userEntityCaches.load(1L); } + @Test + public void testLoadOrInsert() { + var context = new ClassPathXmlApplicationContext("application.xml"); + + // 动态去拿到UserEntity的EntityCaches + @SuppressWarnings("unchecked") + var mailEntityCaches = (IEntityCache) OrmContext.getOrmManager().getEntityCaches(MailEntity.class); + + for (var i = 1; i <= 10; i++) { + var entity = mailEntityCaches.loadOrInit(String.valueOf(i)); + entity.setContent("msg:" + i); + mailEntityCaches.update(entity); + } + + ThreadUtils.sleep(60 * TimeUtils.MILLIS_PER_SECOND); + + mailEntityCaches.load("1"); + } @Test public void collectionTest() { diff --git a/orm/src/test/java/com/zfoo/orm/entity/UserEntity.java b/orm/src/test/java/com/zfoo/orm/entity/UserEntity.java index f0290a0b..907bebd4 100644 --- a/orm/src/test/java/com/zfoo/orm/entity/UserEntity.java +++ b/orm/src/test/java/com/zfoo/orm/entity/UserEntity.java @@ -68,6 +68,11 @@ public class UserEntity implements IEntity { return id; } + @Override + public void setId(Long id) { + this.id=id; + } + public long getId() { return id; } diff --git a/orm/src/test/java/com/zfoo/orm/entity/bag/MapEntity.java b/orm/src/test/java/com/zfoo/orm/entity/bag/MapEntity.java index 22ec12bd..76d60a57 100644 --- a/orm/src/test/java/com/zfoo/orm/entity/bag/MapEntity.java +++ b/orm/src/test/java/com/zfoo/orm/entity/bag/MapEntity.java @@ -36,6 +36,11 @@ public class MapEntity implements IEntity { return id; } + @Override + public void setId(Long id) { + this.id=id; + } + public long getId() { return id; }