Javers一对多关系中获取ListChange的完整对象值

javers一对多关系中获取listchange的完整对象值

本文旨在解决Javers在审计Spring Boot应用中一对多关系时,`ListChange`对象仅提供子实体引用ID而非实际对象值的问题。我们将深入探讨如何利用`javers.findShadows()`方法,结合`QueryBuilder`的精确查询能力,获取父实体及其关联子实体的完整历史快照,从而准确追溯子实体的变更前和变更后状态。

Javers一对多关系变更追踪的挑战

在使用Javers进行数据审计时,常见场景是追踪包含一对多关系(例如,父实体ParentEntity拥有多个子实体ChildEntity)的实体变更。当ChildEntity集合发生变化时,Javers会生成ListChange对象来记录这些集合操作。然而,一个常见的困扰是,这些ListChange对象在描述子实体变更时,往往只提供子实体的全局ID(GlobalId),而非子实体的完整属性值。

考虑以下Java Spring Boot实体结构:

@Entity@Getter@Setter@NoArgsConstructorclass ParentEntity {    @Id    @GenericGenerator(name = "UUIDGenerator", strategy = "uuid2")    @GeneratedValue(generator = "UUIDGenerator")    @Column(name = "id", updatable = false, nullable = false)    private UUID id;    @Column(name = "customer_id")    private String customerId;    @OneToMany(mappedBy = "parentEntity", cascade = CascadeType.ALL, orphanRemoval = true)    private List childEntity;}
@Entity@Getter@Setterclass ChildEntity {    @Id    @GenericGenerator(name = "UUIDGenerator", strategy = "uuid2")    @GeneratedValue(generator = "UUIDGenerator")    @Column(name = "id", updatable = false, nullable = false)    protected UUID id;    @ManyToOne(fetch = FetchType.LAZY)    private ParentEntity parentEntity;}

当ParentEntity中的childEntity列表发生添加、删除或修改操作时,若我们使用如下查询获取变更:

javers.findChanges(QueryBuilder.byInstanceId(id, classname).withSnapshotTypeUpdate().build());

返回的ListChange对象可能包含ReferenceChange,其getLeft()和getRight()方法仅返回子实体的GlobalId,而非其实际的属性值。这使得我们难以直接从ListChange中获取子实体变更前后的完整数据。

解决方案核心:利用javers.findShadows()方法

为了获取子实体的实际值(包括变更前和变更后的版本),Javers提供了findShadows()方法。findShadows()方法用于检索对象的历史快照,即在特定提交(Commit)时的完整数据状态。这些快照被称为“Shadow”(影子对象),它们是对象在某个时间点的完整副本,包含了所有属性值,包括集合中的关联实体。

通过获取父实体在不同时间点的Shadow,我们可以对比这些Shadow中childEntity列表的内容,从而精确地识别出哪些ChildEntity被添加、删除或修改,并获取它们的完整数据。

Vizard Vizard

AI驱动的视频编辑器

Vizard 101 查看详情 Vizard

详细操作步骤与示例代码

1. 查询父实体的历史快照

要获取包含子实体完整数据的历史快照,我们需要对父实体使用findShadows()方法。关键在于构建一个合适的QueryBuilder来筛选出我们感兴趣的快照。

import org.javers.core.Javers;import org.javers.core.commit.CommitId;import org.javers.core.json.JsonConverter;import org.javers.core.metamodel.object.CdoSnapshot;import org.javers.core.query.QueryBuilder;import org.javers.core.shadow.Shadow;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import java.util.List;import java.util.Optional;import java.util.UUID;import java.util.stream.Collectors;@Servicepublic class ParentEntityAuditService {    private final Javers javers;    @Autowired    public ParentEntityAuditService(Javers javers) {        this.javers = javers;    }    /**     * 获取指定父实体在某个提交ID时的历史快照     *     * @param parentId 父实体ID     * @param commitId 提交ID,用于指定获取哪个版本的快照     * @return 包含父实体及其子实体完整数据的Shadow对象列表     */    public List<Shadow> getParentEntityShadowsAtCommit(UUID parentId, CommitId commitId) {        // 构建查询:        // 1. byInstanceId(parentId, ParentEntity.class):指定要查询的父实体实例        // 2. withChangedPropertyIn("childEntity"):筛选在"childEntity"属性上发生过变更的父实体快照。        //    这有助于聚焦于与子实体集合相关的历史记录。        // 3. toCommitId(commitId):指定获取特定提交ID的快照。        //    若要获取某个时间段内的所有快照,可以省略此方法或使用 fromDate()/toDate()。        List<Shadow> rawShadows = javers.findShadows(                QueryBuilder.byInstanceId(parentId, ParentEntity.class)                        .withChangedPropertyIn("childEntity") // 仅获取childEntity属性有变化的快照                        .toCommitId(commitId) // 获取特定提交的快照                        .build()        );        // 将Shadow转换为Shadow        return rawShadows.stream()                .filter(shadow -> shadow.get() instanceof ParentEntity)                .map(shadow -> (Shadow) shadow)                .collect(Collectors.toList());    }    /**     * 获取指定父实体在所有相关提交上的历史快照     *     * @param parentId 父实体ID     * @return 包含父实体及其子实体完整数据的Shadow对象列表     */    public List<Shadow> getAllParentEntityShadows(UUID parentId) {        List<Shadow> rawShadows = javers.findShadows(                QueryBuilder.byInstanceId(parentId, ParentEntity.class)                        .withChangedPropertyIn("childEntity") // 仅获取childEntity属性有变化的快照                        .build() // 不指定toCommitId,获取所有相关快照        );        return rawShadows.stream()                .filter(shadow -> shadow.get() instanceof ParentEntity)                .map(shadow -> (Shadow) shadow)                .collect(Collectors.toList());    }}

2. 解析Shadow对象以获取变更前后数据

Shadow对象包含了在特定提交时ParentEntity的完整状态,包括其childEntity列表。要获取子实体的“变更前”和“变更后”数据,通常需要以下步骤:

确定相关提交: 首先,您需要确定发生变更的提交ID。可以通过javers.findChanges()获取ListChange,其中会包含commitMetadata,从而得知变更发生在哪个提交。获取两个相邻的Shadow: 查找在目标变更提交之前的最近一个ParentEntity的Shadow,以及在目标变更提交之后(或在目标变更提交本身)的ParentEntity的Shadow。比较childEntity列表: 比较这两个Shadow中的childEntity列表,以识别出具体被添加、删除或修改的ChildEntity实例。

以下是一个简化的伪代码示例,展示如何比较两个ParentEntity快照的childEntity列表:

import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.UUID;import java.util.stream.Collectors;public class ShadowComparisonExample {    // 假设我们已经获取了两个ParentEntity的Shadow对象    // Shadow beforeChangeShadow = ...;    // Shadow afterChangeShadow = ...;    public static void analyzeChildEntityChanges(ParentEntity before, ParentEntity after) {        if (before == null || after == null) {            System.out.println("无法比较,缺少变更前或变更后数据。");            return;        }        List beforeChildren = before.getChildEntity() != null ? before.getChildEntity() : new ArrayList();        List afterChildren = after.getChildEntity() != null ? after.getChildEntity() : new ArrayList();        // 将子实体列表转换为Map,以便通过ID快速查找        Map beforeChildrenMap = beforeChildren.stream()                .collect(Collectors.toMap(ChildEntity::getId, child -> child));        Map afterChildrenMap = afterChildren.stream()                .collect(Collectors.toMap(ChildEntity::getId, child -> child));        System.out.println("--- 分析子实体变更 ---");        // 查找被删除的子实体        beforeChildrenMap.forEach((id, child) -> {            if (!afterChildrenMap.containsKey(id)) {                System.out.println("删除的子实体: " + child.getId() + " (原数据: " + child + ")");            }        });        // 查找被添加或修改的子实体        afterChildrenMap.forEach((id, child) -> {            if (!beforeChildrenMap.containsKey(id)) {                System.out.println("添加的子实体: " + child.getId() + " (新数据: " + child + ")");            } else {                // 如果子实体ID存在于变更前后,则可能被修改                ChildEntity oldChild = beforeChildrenMap.get(id);                if (!oldChild.equals(child)) { // 需要ChildEntity正确实现equals和hashCode方法                    System.out.println("修改的子实体: " + child.getId() +                            " (原数据: " + oldChild + ", 新数据: " + child + ")");                }            }        });        System.out.println("--------------------");    }    // 为了示例,这里需要一个ChildEntity的equals和hashCode实现    // @Override    // public boolean equals(Object o) {    //     if (this == o) return true;    //     if (o == null || getClass() != o.getClass()) return false;    //     ChildEntity that = (ChildEntity) o;    //     return Objects.equals(id, that.id) &&    //            Objects.equals(someOtherProperty, that.someOtherProperty); // 比较所有相关属性    // }    //    // @Override    // public int hashCode() {    //     return Objects.hash(id, someOtherProperty);    // }}

注意: 上述比较逻辑依赖于ChildEntity正确实现了equals()和hashCode()方法,以便能够准确判断两个ChildEntity实例是否相同或是否发生了修改。通常,比较所有业务相关的属性是必要的。

注意事项与最佳实践

理解Shadow与Change的区别:Change对象(如ListChange、ValueChange)描述了什么发生了变化以及如何变化的(例如,集合中添加了一个引用ID)。Shadow对象则提供了在特定时间点上整个对象图的完整数据状态。当需要获取实际数据值时,Shadow是更强大的工具。性能考量: findShadows()会加载整个对象图的快照。对于包含大量子实体或复杂关联关系的大型父实体,频繁或不加限制地查询Shadow可能会带来性能开销。建议:使用withChangedPropertyIn()来缩小查询范围,只关注特定属性的变更。使用toCommitId()、fromCommitId()、fromDate()、toDate()等方法精确限定查询的时间或版本范围。考虑对Javers的历史数据进行归档或清理,以控制数据库大小。数据一致性: Javers通过对象的ID来识别集合中的元素。在比较Shadow时,确保您的实体ID是稳定且唯一的,这是正确识别变更的基础。错误处理和空值检查: 在处理Shadow对象及其内部属性时,始终进行必要的空值检查,以避免NullPointerException。ChildEntity的equals()和hashCode(): 正确实现ChildEntity的equals()和hashCode()方法对于比较两个ChildEntity实例是否相同至关重要,尤其是在自定义比较逻辑中。

总结

Javers作为一款强大的审计工具,在处理一对多关系时,虽然ListChange默认只提供引用ID,但通过灵活运用javers.findShadows()方法,我们能够获取到父实体及其关联子实体的完整历史快照。结合QueryBuilder的精确查询和手动比较Shadow中集合内容的方式,可以有效地追溯子实体的变更前和变更后状态,满足更深层次的审计和数据分析需求。理解Shadow和Change的区别,并注意性能和数据一致性,是充分发挥Javers审计能力的关键。

以上就是Javers一对多关系中获取ListChange的完整对象值的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/870893.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
126邮箱手机官网登录2026_126手机邮箱入口直达免费
上一篇 2025年11月28日 05:04:32
怎么看iphone是不是翻新机
下一篇 2025年11月28日 05:04:38

相关推荐

  • windows10如何设置开机不输入密码自动登录_windows10开机自动登录设置方法

    可通过netplwiz设置自动登录,或修改注册表强制启用该功能,还可为本地账户移除密码实现无密码开机。 如果您希望在启动Windows 10时无需手动输入密码即可直接进入桌面,可以通过系统内置功能或修改注册表等方式实现自动登录。此设置能有效提升日常使用的便捷性。 本文运行环境:Dell XPS 13…

    2026年9月29日
    000
  • php怎么安装_在虚拟机中搭建PHP开发环境的教程

    在虚拟机中搭建PHP开发环境,本质是通过LAMP/LEMP栈实现隔离、可控的开发沙盒。答案是:选择Ubuntu Server 22.04等Linux系统,在VirtualBox或VMware中创建虚拟机,分配足够资源并安装OpenSSH;随后更新系统,依次安装Apache(或Nginx)、Maria…

    2026年9月29日
    000
  • win11开机后桌面图标加载慢怎么办_win11桌面图标加载缓慢的优化方法

    win11开机后桌面图标加载慢怎么办_win11桌面图标加载缓慢的优化方法win11开机后桌面图标加载慢怎么办_win11桌面图标加载缓慢的优化方法win11开机后桌面图标加载慢怎么办_win11桌面图标加载缓慢的优化方法win11开机后桌面图标加载慢怎么办_win11桌面图标加载缓慢的优化方法

    首先重启Windows资源管理器以恢复桌面图标显示,接着禁用开机启动项减少资源占用,将系统性能设置为最佳性能模式以降低视觉效果负担,终止Microsoft资讯后台进程避免资源争用,并通过注册表优化任务栏与桌面加载参数,最终提升桌面图标加载速度与系统响应性。 如果您成功进入Windows 11系统,但…

    2026年9月29日 • 用户投稿
    000
  • 酷我音乐如何拉黑歌手

    酷我音乐如何拉黑歌手酷我音乐如何拉黑歌手酷我音乐如何拉黑歌手酷我音乐如何拉黑歌手

    在使用酷我音乐的过程中,如果你希望屏蔽某位歌手以减少其相关内容的出现,可以通过拉黑功能轻松实现。那么,具体该如何操作呢? 首先,启动酷我音乐App,并进入主界面。你可以通过顶部的搜索框输入歌手名称,或通过浏览歌单、排行榜等方式定位到你想屏蔽的歌手。找到目标歌手后,点击进入其个人主页。 在歌手主页中,…

    2026年9月29日 • 用户投稿
    200
  • windows提示“应用程序的并行配置不正确”怎么办 “并行配置不正确”的解决方法

    windows提示“应用程序的并行配置不正确”怎么办 “并行配置不正确”的解决方法windows提示“应用程序的并行配置不正确”怎么办 “并行配置不正确”的解决方法windows提示“应用程序的并行配置不正确”怎么办 “并行配置不正确”的解决方法windows提示“应用程序的并行配置不正确”怎么办 “并行配置不正确”的解决方法

    首先安装或修复Microsoft Visual C++ Redistributable,再运行sfc /scannow修复系统文件,检查应用manifest文件完整性,确保Windows Module Installer服务已启动,并重新注册vcruntime140.dll和msvcp140.dll…

    2026年9月29日 • 用户投稿
    100
  • 显卡核心电压与频率曲线优化指南

    显卡核心电压与频率曲线优化指南显卡核心电压与频率曲线优化指南显卡核心电压与频率曲线优化指南显卡核心电压与频率曲线优化指南

    优化显卡V/F曲线可在保证稳定前提下降低电压,从而减少功耗与温度、提升能效比和持续性能。通过MSI Afterburner等工具对NVIDIA或AMD显卡的电压-频率关系进行逐点微调,结合压力测试验证稳定性,最终实现低温高效运行,适用于超频与节能场景。 显卡核心电压与频率曲线(Voltage-Fre…

    2026年9月29日 • 用户投稿
    000
  • 快手直播怎么放音乐?新人快手怎么直播放歌

    快手直播怎么放音乐?新人快手怎么直播放歌快手直播怎么放音乐?新人快手怎么直播放歌快手直播怎么放音乐?新人快手怎么直播放歌快手直播怎么放音乐?新人快手怎么直播放歌

    随着直播行业的不断发展,越来越多的人开始参与到这一新兴领域中。快手作为国内领先的短视频与直播平台,其直播功能吸引了大量用户。在快手直播过程中,音乐的运用能够有效活跃气氛,提升直播的整体效果。那么,新手如何在快手直播中播放音乐呢?接下来,我们将从多个方面为您详细介绍。 一、快手直播中音乐使用的注意事项…

    2026年9月29日 • 用户投稿
    700
  • Java字符串分段排序:利用正则表达式和Stream API按内嵌数字重排词语

    Java字符串分段排序:利用正则表达式和Stream API按内嵌数字重排词语Java字符串分段排序:利用正则表达式和Stream API按内嵌数字重排词语Java字符串分段排序:利用正则表达式和Stream API按内嵌数字重排词语Java字符串分段排序:利用正则表达式和Stream API按内嵌数字重排词语

    本教程详细介绍了如何使用Java处理包含数字的字符串,并根据这些数字对其中的词语进行重新排序。通过结合正则表达式的查找与分割能力和Stream API的链式操作,我们能够高效地提取词语及其对应的排序数字,并最终重构出一个按指定顺序排列的新字符串。文章提供了具体的代码示例和详细的步骤解析,帮助读者理解…

    2026年9月29日 • 用户投稿
    400
  • windows modern standby是什么_modern standby功能详解

    windows modern standby是什么_modern standby功能详解windows modern standby是什么_modern standby功能详解windows modern standby是什么_modern standby功能详解windows modern standby是什么_modern standby功能详解

    Windows笔记本合盖后仍接收通知和播放音乐,是因启用了Modern Standby功能;该功能基于S0低功耗状态,保持网络连接并实现快速唤醒;通过powercfg /a命令可检测是否支持Modern Standby;用户可在电源选项中管理唤醒设备与联网行为;还可通过修改注册表禁用待机时的网络连接…

    2026年9月29日 • 用户投稿
    000
  • 关闭超线程对现代游戏性能的提升与损失评估

    关闭超线程对现代游戏性能的提升与损失评估关闭超线程对现代游戏性能的提升与损失评估关闭超线程对现代游戏性能的提升与损失评估关闭超线程对现代游戏性能的提升与损失评估

    关闭超线程对游戏性能影响因硬件和场景而异,部分老游戏或竞技类游戏在Intel平台上可能提升帧稳定性,但现代多线程优化游戏及AMD Ryzen平台通常会因关闭而性能下降,需结合具体使用场景测试决定。 关闭超线程对现代游戏性能的影响因具体应用场景而异,不能一概而论。多数情况下,现代游戏更依赖高主频和单核…

    2026年9月29日 • 用户投稿
    000
  • SublimeText如何编译运行C++_MinGW环境配置与BuildSystem设置

    SublimeText如何编译运行C++_MinGW环境配置与BuildSystem设置SublimeText如何编译运行C++_MinGW环境配置与BuildSystem设置SublimeText如何编译运行C++_MinGW环境配置与BuildSystem设置SublimeText如何编译运行C++_MinGW环境配置与BuildSystem设置

    c++kquote>首先确认MinGW已正确安装并配置环境变量,再在Sublime Text中创建自定义Build System:将g++添加到PATH后,新建名为C++_MinGW.sublime-build的JSON文件,写入编译运行指令,保存至User目录;随后通过Ctrl+B编译、Ct…

    2026年9月29日 • 用户投稿
    000
  • 思必驰新品树立行业新标杆 推动智能办公生态演进

    思必驰新品树立行业新标杆  推动智能办公生态演进思必驰新品树立行业新标杆  推动智能办公生态演进思必驰新品树立行业新标杆  推动智能办公生态演进思必驰新品树立行业新标杆  推动智能办公生态演进

    9月24日,思必驰正式推出ai办公本x5系列,配备10.95英寸2.5k超清柔彩显示屏,支持60hz刷新率,直击传统墨水屏反应迟缓、色彩单一等短板,在视觉呈现与手写体验方面实现全面跃升。 凭借技术突破与产品理念的革新,该系列产品为办公本行业注入全新动能。不仅加速了行业技术标准的迭代升级,更为智能办公…

    2026年9月29日 • 用户投稿
    100
  • 多模态AI需要多大算力 硬件需求与优化建议

    多模态AI需要多大算力 硬件需求与优化建议多模态AI需要多大算力 硬件需求与优化建议多模态AI需要多大算力 硬件需求与优化建议多模态AI需要多大算力 硬件需求与优化建议

    多模态ai因需同时处理图像、文本、音频等多样数据,其算力和硬件需求远超单模态模型。1. 多模态ai更“吃”资源的原因在于各类数据(如视频、图像、文字)本身复杂度不同,且融合阶段(如跨模态注意力机制)带来额外计算负担;2. 硬件配置建议包括使用高性能gpu集群(如a100或h100)、大容量内存(至少…

    2026年9月29日 • 用户投稿
    000
  • VSCode如何设置调试时自动调整窗口布局方便查看 VSCode调试自动调整窗口布局的新颖配置技巧​

    在vscode中实现调试时自动调整窗口布局的核心方法是通过tasks.json定义布局任务,并在launch.json中使用prelaunchtask触发,从而在调试启动前自动切换到预设视图;具体步骤为:1. 在tasks.json中创建任务,使用vscode内部命令(如workbench.acti…

    2026年9月29日
    100
  • 360极速浏览器如何导入Firefox火狐浏览器书签_从火狐同步收藏夹数据方法

    360极速浏览器如何导入Firefox火狐浏览器书签_从火狐同步收藏夹数据方法360极速浏览器如何导入Firefox火狐浏览器书签_从火狐同步收藏夹数据方法360极速浏览器如何导入Firefox火狐浏览器书签_从火狐同步收藏夹数据方法360极速浏览器如何导入Firefox火狐浏览器书签_从火狐同步收藏夹数据方法

    首先通过360极速浏览器内置功能可直接从Firefox导入书签,或通过导出HTML文件中转实现跨浏览器迁移,具体步骤包括选择源浏览器、导出书签为HTML及从HTML文件导入等操作。 如果您需要在更换浏览器时保留重要的收藏夹数据,可以将火狐浏览器的书签迁移到360极速浏览器中。以下是完成此操作的具体步…

    2026年9月29日 • 用户投稿
    000
  • 斑马智行全球首发全模态端侧大模型解决方案 推动智舱进入AI时代

    斑马智行全球首发全模态端侧大模型解决方案  推动智舱进入AI时代斑马智行全球首发全模态端侧大模型解决方案  推动智舱进入AI时代斑马智行全球首发全模态端侧大模型解决方案  推动智舱进入AI时代斑马智行全球首发全模态端侧大模型解决方案  推动智舱进入AI时代

    9月24日,2025云栖大会在杭州拉开帷幕,阿里巴巴集团ceo、阿里云智能集团董事长兼ceo吴泳铭发表主题演讲,首次全面揭示实现asi(人工超级智能)的三步演进路径:智能涌现、自主行动与自我迭代,勾勒出从模仿人类、辅助人类到最终超越人类的完整发展图景。 围绕这一战略构想,吴泳铭明确提出:“大模型将成…

    2026年9月29日 • 用户投稿
    000
  • windows怎么打开任务管理器_Windows任务管理器打开方式汇总

    windows怎么打开任务管理器_Windows任务管理器打开方式汇总windows怎么打开任务管理器_Windows任务管理器打开方式汇总windows怎么打开任务管理器_Windows任务管理器打开方式汇总windows怎么打开任务管理器_Windows任务管理器打开方式汇总

    快捷键Ctrl+Shift+Esc可直接打开任务管理器;02. 右键任务栏选择“任务管理器”;03. Win+R输入taskmgr启动;04. 开始菜单搜索“任务管理器”并点击;05. 文件资源管理器地址栏输入taskmgr:回车开启。 如果您发现电脑运行缓慢或某个程序无响应,可能需要查看系统资源使…

    2026年9月29日 • 用户投稿
    000
  • 淘宝收货地址添加失败 淘宝地址管理设置教程

    淘宝收货地址添加失败 淘宝地址管理设置教程淘宝收货地址添加失败 淘宝地址管理设置教程淘宝收货地址添加失败 淘宝地址管理设置教程淘宝收货地址添加失败 淘宝地址管理设置教程

    答案:淘宝添加收货地址失败多因信息不全、含特殊字符、超字数、格式错误或网络问题。应确保地址完整准确,使用标准地名和正规格式,避免表情符号,控制字数,填写正确姓名与手机号,并通过清除缓存、切换网络等方式提升成功率。 在使用淘宝购物时,添加收货地址失败是不少用户常遇到的问题。其实大多数情况是由于填写不规…

    2026年9月29日 • 用户投稿
    000
  • 多模态AI模型安全加固措施 多模态AI防护配置指南

    多模态AI模型安全加固措施 多模态AI防护配置指南多模态AI模型安全加固措施 多模态AI防护配置指南多模态AI模型安全加固措施 多模态AI防护配置指南多模态AI模型安全加固措施 多模态AI防护配置指南

    多模态ai模型的安全性可通过四方面措施加强:1. 多模态内容过滤,包括使用先进算法、定期更新规则、设置多层验证;2. 防范对抗攻击,通过增强鲁棒性、实时监控、数据预处理;3. 跨域安全防护,实施传输过滤、加密通信、访问控制;4. 指令遵循与幻觉抑制,优化指令数据、提升泛化能力、建立检测机制。 ☞☞☞…

    2026年9月29日 • 用户投稿
    000
  • Sublime安装Markdown插件_Markdown写作环境配置教程

    Sublime安装Markdown插件_Markdown写作环境配置教程Sublime安装Markdown插件_Markdown写作环境配置教程Sublime安装Markdown插件_Markdown写作环境配置教程Sublime安装Markdown插件_Markdown写作环境配置教程

    首先安装MarkdownEditing和MarkdownPreview插件,可通过Package Control或手动下载完成;接着配置自定义构建系统以支持Markdown转HTML输出;最后利用MarkdownPreview实现实时浏览器预览,从而高效编写并即时查看Markdown文档。 如果您希…

    2026年9月29日 • 用户投稿
    100

发表回复

登录后才能评论
关注微信