计算机编程的持久性是指将数据保存在应用程序存储器之外的能力。
我最近注意到,当我在 Chrome 检查窗口中编辑样式(例如,向 div 添加边框)时,如果我关闭检查窗口,甚至刷新页面,样式将保留。最
在 equals 方法中仅包含实体 id 时,无法将新实体添加到集合中
我想问一下实体上有 equals 方法。 我正在运行一个设置,其中我仅根据 Id 比较实体,并认为这是最好的做事方式。然而我意识到当...
持久化 std::chrono time_point 实例然后将它们读回相同类型的另一个实例的正确方法是什么? typedef std::chrono::time_point 持久化 std::chrono time_point 实例然后将它们读回相同类型的另一个实例的正确方法是什么? typedef std::chrono::time_point<std::chrono::high_resolution_clock> time_point_t; time_point_t tp = std::chrono::high_resolution_clock::now(); serializer.write(tp); . . . time_point_t another_tp; serializer.read(another_tp); 对写入/读取的调用,假设 time_point_t 类型的实例可以以某种方式转换为字节表示形式,然后可以将其写入磁盘或套接字等或从磁盘或套接字等读取。 Alf 建议的一个可能的解决方案如下: std::chrono::high_resolution_clock::time_point t0 = std::chrono::high_resolution_clock::now(); //Generate POD to write to disk unsigned long long ns0 = t0.time_since_epoch().count(); //Read POD from disk and attempt to instantiate time_point std::chrono::high_resolution_clock::duration d(ns0) std::chrono::high_resolution_clock::time_point t1(d); unsigned long long ns1 = t1.time_since_epoch().count(); if ((t0 != t1) || (ns0 != ns1)) { std::cout << "Error time points don't match!\n"; } 注意: 上面的代码有一个错误,因为最终实例化的时间点与原始时间点不匹配。 在旧式 time_t 的情况下,通常只是根据其 sizeof 将整个实体写入磁盘,然后以相同的方式读回 - 简而言之,新的 std::chrono 类型相当于什么? 从磁盘或套接字读取意味着您可能正在未执行写入操作的应用程序实例中进行读取。 在这种情况下,仅序列化持续时间是不够的。 A time_point 是自未指定纪元以来的 duration 时间量。 纪元可以是任何东西。 在我的计算机上,std::chrono::high_resolution_clock的纪元是计算机启动时。 IE。该时钟报告自启动以来的纳秒数。 如果一个应用程序写入 time_since_epoch().count(),计算机重新启动,然后另一个(甚至相同)应用程序将其读回,则读入的值没有任何意义,除非您碰巧以某种方式知道两次启动之间的时间量。 为了可靠地序列化 time_point,必须安排作者和读者就某个纪元达成一致,然后确保写入和读取的 time_point 是相对于该纪元的。 例如,人们可能会安排使用 POSIX 纪元:New Years 1970 UTC。 事实证明,我所知道的每个 std::chrono::system_clock 实现都使用 Unix 时间,这是从 1970 年新年开始测量的 UTC 的近似值。但是我知道 std::chrono::high_resolution_clock 没有共同的纪元。 只有当您能够以某种方式确保读取器和写入器时钟在共同纪元上达成一致时,您才能将 time_point 序列化为持续时间。 C++20 更新 std::chrono::system_clock的纪元现在指定为Unix时间(1970-01-01 00:00:00 UTC,忽略闰秒)。 time_point构造函数接受一个duration,您可以从成员duration获得一个time_since_epoch。因此,问题减少为序列化 duration 值。并且 duration 有一个接受多个刻度的构造函数,以及一个生成刻度数的成员函数 count。 这一切只是通过谷歌搜索std::chrono::time_point并查看谷歌给我找到的cppreference文档。 阅读文档通常是个好主意。 附录:一个例子。 #include <chrono> #include <iostream> #include <typeinfo> using namespace std; auto main() -> int { using Clock = chrono::high_resolution_clock; using Time_point = Clock::time_point; using Duration = Clock::duration; Time_point const t0 = Clock::now(); //Generate POD to write to disk Duration::rep const ns0 = t0.time_since_epoch().count(); //Read POD from disk and attempt to instantiate time_point Duration const d(ns0); Time_point const t1(d); cout << "Basic number type is " << typeid( ns0 ).name() << "." << endl; if( t0 != t1 ) { cout << "Error time points don't match!" << endl; } else { cout << "Reconstituted time is OK." << endl; } } 在 Visual C++ 12.0 中,报告的基本类型是 __int64,即 long long,而在 Windows 中的 g++ 4.8.2 中,报告的类型是 x,这可能意味着相同。 两个编译器的重构时间与原始时间相同。 附录:正如 Dina 在评论中指出的那样,从 C++14 开始,C++ 标准没有指定纪元,因此为了使其跨机器或使用不同的时钟工作,有必要添加额外的步骤,标准化序列化数据的纪元,例如最自然的是Posix 时间,即自 1970 年 1 月 1 日星期四 00:00:00 协调世界时 (UTC) 以来的时间。
使用 JPA EntityManager 和 JPA Query 对象,如何重写具有注释 @OneToMany(fetch = FetchType.EAGER) 的内容以在查询中延迟获取? 如果我有冬眠的话
我面临着一个非常烦人的问题。我有一个 Recipe 实体,其中包含一些具有多对多关系的成分(带有一个 Ingredient 实体)和一个用于映射的 RecipeIngredient 实体。 ...
我有以下 hql 查询: @Query("从电子邮件订阅中选择 es " +“JOIN FETCH es.subscriber s” + "WHERE es.subscriptionTypeId = :typeId " +“...
hibernate 内部使用 jdbc 还是 JTA 还是可配置的?
我是hibernate新手,开始学习hibernate。我将要阅读的章节使用 hibernate 和 JDBC。我的第一个问题是 hibernate 在内部使用 jdbc 还是在内部使用 JTA 来执行...
我有这样的结构: 实体1-> 实体2-> 实体3 对 Entity1 执行保存,并让持久性保存父级和子级。 实体 3 之前已保存在数据库中
NetBeans 15 无法生成,因为 EJB Lite 类在项目类路径上不可用
我正在尝试使用 NetBeans 15、Java Web 项目和 Ant 从实体类创建持久性新 JSF 页面。 我收到此错误: 无法生成,因为 EJB Lite 类在
Redis版本:v7.0.12 你好。 我已使用 ot-helm/redis-operator 在 Kubernetes 集群中部署了一个 Redis 集群,其值如下: redis集群: redis秘密: 秘密名称:redis-pas...
作为反应式 quarkus/hibernate/panache 的新手,我非常感谢您对如何将循环中的实体持久保存到数据库的反馈。 让我们假设在某个时候我们有一个部门列表...
为什么Properties.Settings.Default没有被保存?
我写这个是为了快速测试 为什么我的设置没有被保存?我第一次运行这个时,我有 3(旧)/3(当前)元素。第二次我得到 3(旧)/5(当前),第三次得到 5(旧)/5(当前)。 ...
我正在尝试用django实现持久数据库连接池。 其中一种选择是使用内置的 psycopg2.pool 代码,它提供不同类型的池(PersistentConnectionPool,
我创建了一个小型 Web 应用程序来学习不同的 Web 技术(HTML、CSS、JavaScript 等)。因为我想存储数据并对其执行一些操作,所以我使用了 IndexedDB。我是
Hibernate JoinColumn 引用的ColumnName
我有一个使用 ElementCollection 的实体。我在设置一切时遇到了麻烦,但找到了解决方案。现在我想了解为什么需要这样做。 这是我的实体 @实体 公开课
当按表单条件过滤数据时,用于分页数据的最佳 ASP.NET MVC 模式是什么? 这个问题类似于:Preserve data in .net mvc 但肯定有更好的答案吗? 当前...
我希望 Android 应用程序即使在恢复出厂设置后也能保留。我该怎么做?
我正在尝试让企业应用程序保留在Android设备(Android 12 root)上,即使在恢复出厂设置后也是如此。我该怎么做呢? 我曾尝试使用 syste 将应用程序制作为系统应用程序...
是否可以使用 SwiftData 拥有单个数据实体? (非数组,如持久应用程序设置)
我想要一个带有 SwiftData 的设置实体。我希望它存储用户上次使用该应用程序时正在使用的活动实体,以及我想要的一些其他设置...
使用 hibernate.enable_lazy_load_no_trans 解决 Hibernate Lazy-Init 问题
我一直遭受着臭名昭著的休眠异常 org.hibernate.LazyInitializationException:无法初始化代理 - 无会话 现在,社会各界一片欢呼 我一直遭受着臭名昭著的休眠异常 org.hibernate.LazyInitializationException: could not initialize proxy - no Session 现在,社区正在欢呼雀跃 <property name="hibernate.enable_lazy_load_no_trans" value="true"/> 说它解决了问题,但谨慎使用。 谨慎使用是什么意思?这个属性实际上是做什么的? 请给我任何见解。 这种方法的问题是你可以产生N+1效果。 想象您有以下实体: public class Person{ @OneToMany // default to lazy private List<Order> orderList; } 如果您有一个返回 10K 人员的报告,并且在此报告中您执行代码 person.getOrderList(),JPA/Hibernate 将执行 10K 查询。这就是 N+1 效果,您将无法控制所有将要执行的查询。 现在想象一下 Order 如下所示: public class Order{ @OneToMany // default to lazy private List<EmailSent> emailSentList; } 现在想象一下,您对 person.getOrderList() 进行了一次迭代,并且对于每个 Order order,您将执行一次 order.getEmailSentList()。现在你能看出问题所在了吗? 对于 LazyInitializationException 你可以有一些解决方案: 使用 OpenInSessionInView 方法。您将需要创建一个将打开和关闭事务的 WebFilter。问题在于N+1效应。 使用 hibernate.enable_lazy_load_no_trans 配置,这是一个 hibernate,如果需要,您将无法将您的项目移植到其他 JPA 提供程序。还可以有N+1的效果 使用名为 PersistenceContext Extended 的 EJB 功能。这样,您将保持多个事务的上下文处于打开状态。问题是:可能会发生 N+1 效应,使用大量服务器内存(实体将保持托管状态) 在查询中使用 FETCH。通过这种方法,您可以执行如下 JPQL/HQL:select p from Person p join fetch p.orderList。通过此查询,您将从数据库加载列表,并且不会产生 N+1 效果。问题是您需要为每种情况编写 JPQL。 如果仍有任何问题,请检查以下链接: 第 1 部分 第 2 部分 这违背了我们利用 Hibernate 通过 Session 概念强制执行可重复读取语义的方式。 当首次加载对象时,如果在会话生命周期内再次引用该对象,则返回相同的对象,无论该对象在数据库中是否已更改。这就是hibernate自动提供的可重复读语义。 使用此设置,您将没有会话提供此保证,因此如果您现在访问此数据,您将获得最新版本的数据。 这可能没问题。但考虑一下这样的场景:该对象长时间保存在某个地方,并且数据发生了很大变化,因此延迟获取的数据与会话处于活动状态时已加载的数据有很大不同。这是你需要关心的。 简单来说,如果您的程序是 不受以下因素影响: 进入时已获取的数据有多陈旧 会话到将从会话中延迟获取的数据 但是,如果这是一个问题(你的程序面临计时问题,一次可能运行良好,另一次则失败)是一个问题,那么在会话中获取所有必要的数据。 解决 LazyInitializationException 的最佳方法是在实体查询中使用 JOIN FETCH 指令。 急切加载对性能不利。此外,还有一些反模式,例如: 在视图中打开会话 hibernate.enable_lazy_load_no_trans 您永远不应该使用它,因为它们要么需要打开数据库连接以进行 UI 渲染(在视图中打开会话),要么在初始持久性上下文之外获取的每个惰性关联都需要数据库连接(hibernate.enable_lazy_load_no_trans ). 有时,您甚至不需要实体,DTO 投影甚至更好。 可能是因为有更好的解决方案,例如@Transactional,其中打开和关闭会话遵循一种非常常见的模式:“打开会话然后将所有内容包装在 try-catch-finally 中;catch 回滚并最终关闭会话。”此注释通常位于 Web 应用程序和服务的请求级别。 或者,如果您需要更精细的控制,您可以使用 SessionFactory 手动打开会话。 正如其他人提到的,延迟加载是您需要注意的事情。这不是灵丹妙药,但非常有帮助。一般来说,如果您的应用程序设计为有许多小请求,那么就可以了。 预加载也可能非常糟糕。例如,当您的对象模型具有大量多对多关系,但您的请求不使用超过一层深度的数据时。 或者你可以暂时忘记整件事。使用延迟加载,直到它成为问题为止。如果确实如此,那么无论如何,使用 Mybatis 会更好。
当我在持久性 xml 中提供另一个端口 5432 时,连接到端口 1,527 上的服务器本地主机时出错
在Java EE中,我提供了persistence.xml并正确打包。 在 Java EE 中,我提供了 persistence.xml 并且已正确打包。 <?xml version="1.0" encoding="UTF-8" ?> <persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" version="2.0" xmlns="http://java.sun.com/xml/ns/persistence"> <persistence-unit name="ArticleManagement"> <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> <class>com.pauljabines.portfolio.Article</class> <properties> <property name="javax.persistence.jdbc.url" value="jdbc:postgresql://localhost:5432/postgres" /> <property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver" /> <property name="javax.persistence.jdbc.user" value="postgres" /> <property name="javax.persistence.jdbc.password" value="************************" /> <property name="eclipselink.logging.level" value="ALL" /> </properties> </persistence-unit> </persistence> 问题:有了这些连接属性,为什么 glassfish 会抛出错误并说无法连接到端口 1527? 这是一些堆栈跟踪: org.glassfish.deployment.common.DeploymentException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.7.0.v20170811-d680af5): org.eclipse.persistence.exceptions.DatabaseException Internal Exception: java.sql.SQLException: Error in allocating a connection. Cause: Connection could not be allocated because: java.net.ConnectException : Error connecting to server localhost on port 1,527 with message Connection refused: connect. 解决方案是在glassfish中为postgresql创建一个jdbc连接池。为此: 在此处下载 postgresql jdbc 驱动程序并将其放置在 glassfish5\glassfish\domains\domain1\lib 中。 重新启动你的glassfish。 转到 glassfish 管理网页 localhost:4848。 转到 JDBC -> JDBC 连接池 单击“新建”以创建一个。 池名称 = 任何你想要的东西 资源类型 = javax.sql.ConnectionPoolDataSource 数据源类名 = org.postgresql.jdbc3.Jdbc3PoolingDataSource 对于属性,创建这些: 用户= postgres,你的用户 portNumber = 5432,数据库的端口号 密码 = 连接数据库的密码 databaseName = Portfolio, 要连接的数据库名称 服务器名称 = 本地主机,您的服务器名称 Ping 进行测试。 保存。 转到 JDBC -> 资源并编辑 jdbc/__default。 将池名称设置为您创建的池的池名称。 我今天也遇到了这个问题,我发现如果您使用@PersistenceUnit注释,应用程序会尝试连接到Glassfish服务器的内部JavaDB,我不知道为什么。因此,您可以进入 Glassfish 安装的 bin 目录并运行“asadmin start-database”以在端口 1527 启动 JavaDB。然后您的应用程序应该运行。但我认为这很令人困惑。所以我建议在没有 @PersistenceUnit 注释的情况下工作。使用“Persistence.createEntityManagerFactory()”创建 EntityManagerFactory。这无需启动 JavaDB 即可工作。