entitymanager 相关问题

EntityManager是PersistenceContext的表示,允许用户操作从数据库中提取的数据。

集成测试:无法创建 org.jboss.arquillian.test.impl.EventTestRunnerAdaptor 类的新实例

我想针对数据库创建一个集成测试,然后在 wildfly/arquillian 环境中清理它。但是当我尝试执行测试时,我收到 Could not create new instance of c...

回答 1 投票 0

在 JPA / EclipsLink EntityManager 中更改隔离级别后进行清理

我正在使用自定义事务隔离级别在 JPA (EclipseLink) 中执行事务,我使用以下代码在 JPA EntityManager 的底层连接上设置了该级别: // 开始交易

回答 2 投票 0

在多线程环境下使用自定义entityManager

我使用EntityManager做了一些自定义查询,但遇到了一些问题。 首先,我将entityManager定义为单例bean,并注入到我的服务中,但是如果多个用户请求我的s...

回答 1 投票 0

EntityManager.remove 和 EntityManager.persist 上的 JPA 重复条目错误

我正在使用 JPA 的 Hibernate 实现。假设我有一个对象列表,必须将其保留在名为“事件”的表中。所有这些对象都具有相同的邮政编码。 公共课事件{ 圣...

回答 3 投票 0

JPA中实现分页的正确方法是什么?

我查看了这个问题的一些细节,但我在实现分页时仍然遇到问题。我认为这可能与我的实体管理器的设置方式有关。 我正在使用 Spri...

回答 1 投票 0

LoggerFactory 异常

在我的Java应用程序中,我需要使用连接池,所以我决定实现HibernateCP。问题是我得到这个异常,我需要添加以下内容:org/slf4j/LoggerFactory。完整

回答 1 投票 0

您可以从 EntityListener 访问 EntityManager 吗?

我知道 JSR-000220 Enterprise JavaBeans 3.0 Final Release(持久性)规范指出: “一般来说,便携式应用程序不应调用 EntityManager 或查询操作, 访问其他条目...

回答 2 投票 0

在 JAX-RS 资源中使用共享 EntityManager 的正确方法是什么

我在 Jersey JAX-RS 中有一个 REST 客户端,它接受请求,然后使用 Hibernate 的 JPA 实现从数据库检索数据并返回 JSON。 使用共享实体管理器,

回答 1 投票 0

在 Spring 应用程序中使用 JpaRepository 还是 EntityManager 更好?

两种方法我都用过,但是有什么区别,哪个更好?

回答 2 投票 0

在 Spring 应用程序中使用存储库管理器还是实体管理器更好?

两种方法我都用过,但是有什么区别,哪个更好?

回答 2 投票 0

未找到 EntityManager 提供程序

我在独立应用程序(没有框架)上使用了hibernate EntityManager。 这是我的 pom.xml : 我在独立应用程序上使用了 hibernate EntityManager(没有框架)。 这是我的pom.xml: <project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>ir.moke.roboexchange</groupId> <artifactId>roboexchange</artifactId> <version>1.0-SNAPSHOT</version> <organization> <name>Moke</name> <url>http://www.moke.ir</url> </organization> <name>Moke :: RoboExchange</name> <properties> <junit.jupiter.version>5.9.2</junit.jupiter.version> <junit.platform.version>1.9.2</junit.platform.version> </properties> <packaging>jar</packaging> <dependencies> <!-- ORM --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>6.6.0.Final</version> </dependency> <dependency> <groupId>org.hibernate.orm</groupId> <artifactId>hibernate-ant</artifactId> <version>6.6.0.Final</version> </dependency> <!-- Json --> <dependency> <groupId>org.eclipse</groupId> <artifactId>yasson</artifactId> <version>3.0.2</version> </dependency> <!-- Database --> <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <version>42.5.4</version> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>4.3.1</version> </dependency> <!-- Log --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>2.0.5</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.4.6</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> <version>1.4.6</version> </dependency> <!-- Test --> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-engine</artifactId> <version>${junit.jupiter.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> <version>${junit.jupiter.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-params</artifactId> <version>${junit.jupiter.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.junit.platform</groupId> <artifactId>junit-platform-suite</artifactId> <version>${junit.platform.version}</version> <scope>test</scope> </dependency> </dependencies> <build> <finalName>roboexchange</finalName> <plugins> <!-- Java compiler version --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <release>17</release> </configuration> </plugin> <!-- copy compiled jar file to target/lib --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.2.2</version> <configuration> <archive> <manifest> <addClasspath>true</addClasspath> <mainClass>ir.moke.roboexchange.MainClass</mainClass> </manifest> </archive> <outputDirectory>${project.build.directory}/lib/</outputDirectory> </configuration> </plugin> <!-- Copy dependencies --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <id>copy-dependencies</id> <phase>package</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <outputDirectory>${project.build.directory}/lib</outputDirectory> <includeScope>compile</includeScope> </configuration> </execution> </executions> </plugin> </plugins> </build> </project> 这是我的persistence.xml: <persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd" version="2.1"> <persistence-unit name="db-connection" transaction-type="RESOURCE_LOCAL"> <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> </persistence-unit> </persistence> 我有一个名为EntityManagerProducer的课程: import ir.moke.roboexchange.config.Configuration; import jakarta.persistence.EntityManager; import jakarta.persistence.EntityManagerFactory; import jakarta.persistence.Persistence; import java.util.HashMap; import java.util.Map; public class EntityManagerProducer { public static final EntityManagerProducer instance = new EntityManagerProducer(); private final EntityManagerFactory entityManagerFactory; private final EntityManager entityManager; private EntityManagerProducer() { String hostname = Configuration.dbHost; String port = Configuration.dbPort; String username = Configuration.dbUsername; String password = Configuration.dbPassword; Map<String, Object> properties = new HashMap<>(); properties.put("hibernate.connection.driver_class", "org.postgresql.Driver"); properties.put("hibernate.connection.url", "jdbc:postgresql://%s:%s/roboexchange".formatted(hostname, port)); properties.put("hibernate.connection.username", username); properties.put("hibernate.connection.password", password); properties.put("hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect"); this.entityManagerFactory = Persistence.createEntityManagerFactory("db-connection", properties); this.entityManager = this.entityManagerFactory.createEntityManager(); } public EntityManager getEntityManager() { return entityManager; } public EntityManagerFactory getEntityManagerFactory() { return entityManagerFactory; } } 这是我的 CRUD 示例: public class SampleCRUD { private static final EntityManager em = EntityManagerProducer.instance.getEntityManager(); public static void insert(Sample sample) { EntityTransaction transaction = em.getTransaction(); transaction.begin(); em.persist(sample); transaction.commit(); } } 我的主课使用 Intellij IDEA 没有任何问题。 但是当我将项目导出为 jar 文件并运行它时,会导致此异常: Aug 22, 2024 8:40:24 PM jakarta.persistence.spi.PersistenceProviderResolverHolder$DefaultPersistenceProviderResolver log WARNING: jakarta.persistence.spi::No valid providers found. Exception in thread "Timer-0" java.lang.ExceptionInInitializerError at ir.moke.roboexchange.strategy.StrategyManager.<clinit>(StrategyManager.java:22) at ir.moke.roboexchange.job.FetchStatistics_5Min.run(FetchStatistics_5Min.java:20) at java.base/java.util.TimerThread.mainLoop(Timer.java:566) at java.base/java.util.TimerThread.run(Timer.java:516) Caused by: jakarta.persistence.PersistenceException: No Persistence provider for EntityManager named db-connection at jakarta.persistence.Persistence.createEntityManagerFactory(Persistence.java:86) at ir.moke.roboexchange.producer.EntityManagerProducer.<init>(EntityManagerProducer.java:28) at ir.moke.roboexchange.producer.EntityManagerProducer.<clinit>(EntityManagerProducer.java:12) ... 4 more 注意:persistence.xml里面的jar文件位于META-INF目录下 注意:我混合了persistence.xml和以编程方式进行类,因为配置可能会动态更改。 更新: 运行应用程序: > mvn clean compile package > cd target/lib > java -jar roboexchange.jar 11:12:21,734 |-INFO in ch.qos.logback.core.model.processor.AppenderModelHandler - About to instantiate appender of type [ch.qos.logback.core.ConsoleAppender] 11:12:21,769 |-WARN in ch.qos.logback.core.ConsoleAppender[CONSOLE] - This appender no longer admits a layout as a sub-component, set an encoder instead. 11:12:21,769 |-WARN in ch.qos.logback.core.ConsoleAppender[CONSOLE] - To ensure compatibility, wrapping your layout in LayoutWrappingEncoder. 11:12:21,769 |-WARN in ch.qos.logback.core.ConsoleAppender[CONSOLE] - See also http://logback.qos.ch/codes.html#layoutInsteadOfEncoder for details 11:12:21,769 |-WARN in ch.qos.logback.core.model.processor.AppenderModelHandler - Appender named [FILE-ROLLING] not referenced. Skipping further processing. 11:12:21,770 |-INFO in ch.qos.logback.classic.model.processor.LoggerModelHandler - Setting level of logger [org.hibernate] to INFO 11:12:21,774 |-INFO in ch.qos.logback.classic.model.processor.LoggerModelHandler - Setting additivity of logger [org.hibernate] to false 11:12:21,775 |-INFO in ch.qos.logback.core.model.processor.AppenderRefModelHandler - Attaching appender named [CONSOLE] to Logger[org.hibernate] 11:12:21,775 |-INFO in ch.qos.logback.classic.model.processor.LoggerModelHandler - Setting level of logger [ir.moke.roboexchange] to DEBUG 11:12:21,775 |-INFO in ch.qos.logback.classic.model.processor.LoggerModelHandler - Setting additivity of logger [ir.moke.roboexchange] to false 11:12:21,775 |-INFO in ch.qos.logback.core.model.processor.AppenderRefModelHandler - Attaching appender named [CONSOLE] to Logger[ir.moke.roboexchange] 11:12:21,775 |-INFO in ch.qos.logback.classic.model.processor.RootLoggerModelHandler - Setting level of ROOT logger to ALL 11:12:21,776 |-INFO in ch.qos.logback.core.model.processor.AppenderRefModelHandler - Attaching appender named [CONSOLE] to Logger[ROOT] 11:12:21,776 |-INFO in ch.qos.logback.core.model.processor.DefaultProcessor@33cb5951 - End of configuration. 11:12:21,776 |-INFO in ch.qos.logback.classic.joran.JoranConfigurator@365c30cc - Registering current configuration as safe fallback point ... ... ... ...... and other logs ..... ... ... Aug 22, 2024 8:40:24 PM jakarta.persistence.spi.PersistenceProviderResolverHolder$DefaultPersistenceProviderResolver log WARNING: jakarta.persistence.spi::No valid providers found. Exception in thread "Timer-0" java.lang.ExceptionInInitializerError at ir.moke.roboexchange.strategy.StrategyManager.<clinit>(StrategyManager.java:22) at ir.moke.roboexchange.job.FetchStatistics_5Min.run(FetchStatistics_5Min.java:20) at java.base/java.util.TimerThread.mainLoop(Timer.java:566) at java.base/java.util.TimerThread.run(Timer.java:516) Caused by: jakarta.persistence.PersistenceException: No Persistence provider for EntityManager named db-connection at jakarta.persistence.Persistence.createEntityManagerFactory(Persistence.java:86) at ir.moke.roboexchange.producer.EntityManagerProducer.<init>(EntityManagerProducer.java:28) at ir.moke.roboexchange.producer.EntityManagerProducer.<clinit>(EntityManagerProducer.java:12) ... 4 more 这是 jar 文件内 MANIFEST.MF 的内容: Manifest-Version: 1.0 Created-By: Maven JAR Plugin 3.2.2 Build-Jdk-Spec: 21 Class-Path: hibernate-core-6.6.0.Final.jar jakarta.persistence-api-3.1.0 .jar jakarta.transaction-api-2.0.1.jar jboss-logging-3.5.0.Final.jar hi bernate-commons-annotations-7.0.1.Final.jar jandex-3.2.0.jar classmate- 1.5.1.jar byte-buddy-1.14.18.jar jakarta.xml.bind-api-4.0.0.jar jakarta .activation-api-2.1.0.jar jaxb-runtime-4.0.2.jar jaxb-core-4.0.2.jar an gus-activation-2.0.0.jar txw2-4.0.2.jar istack-commons-runtime-4.1.1.ja r jakarta.inject-api-2.0.1.jar antlr4-runtime-4.13.0.jar hibernate-ant- 6.6.0.Final.jar yasson-3.0.2.jar jakarta.json.bind-api-3.0.0.jar jakart a.json-api-2.1.0.jar parsson-1.1.0.jar postgresql-42.5.4.jar checker-qu al-3.5.0.jar jedis-4.3.1.jar commons-pool2-2.11.1.jar json-20220320.jar gson-2.8.9.jar slf4j-api-2.0.5.jar logback-classic-1.4.6.jar logback-c ore-1.4.6.jar Main-Class: ir.moke.roboexchange.MainClass 我终于解决了我的问题。 maven-dependency-plugin 应该这样配置: <!-- Copy dependencies --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <id>copy-dependencies</id> <phase>package</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <outputDirectory>${project.build.directory}/lib</outputDirectory> <includeScope>runtime</includeScope> </configuration> </execution> </executions> </plugin> 注意: 应该配置复制runtime依赖项

回答 1 投票 0

如何在不使用EntityManager.refresh的情况下使用PESSIMISTIC_WRITE锁确保更新数据?

我在 Hibernate 查询中遇到问题,需要使用 PESSIMISTIC_WRITE 锁。锁在并发事务中工作正常,但查询返回的信息已过时。为了...

回答 1 投票 0

Hibernate:如何在不使用 EntityManager.refresh 的情况下使用 PESSIMISTIC_WRITE 锁确保更新数据?

我在 Hibernate 查询中遇到问题,需要使用 PESSIMISTIC_WRITE 锁。锁在并发事务中工作正常,但查询返回的信息已过时。为了...

回答 1 投票 0

如何在Symfony2中拥有模型管理器?

抱歉,如果这个问题已经得到解答,我找不到任何答案。 我正在 Symfony2 中构建这个模型: 类 LogEntry { /** * @var 整数 $id * * @ORM\Column(name="id", t...

回答 1 投票 0

如何设置 JPA EntityManager 查询的超时时间

我目前从 EntityManager 查询中收到连接超时错误。是否可以为这些设置超时? 持久性.xml 我当前从 EntityManager 查询中收到连接超时错误。可以为这些设置超时吗? 持久性.xml <?xml version="1.0" encoding="UTF-8"?> <persistence version="2.0" xmlns="http://java.sun.com/xml/ns/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"> <persistence-unit name="CallPU" transaction-type="RESOURCE_LOCAL"> <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> <class>call.structure.Task</class> <class>call.structure.Installation</class> <class>call.structure.Contents</class> <class>call.structure.Recipient</class> <class>call.structure.CallTask</class> <class>call.structure.SmsTask</class> <class>call.structure.EmailTask</class> <class>call.security.User</class> <class>call.structure.content.Content</class> <class>call.structure.content.RecordContent</class> <class>call.structure.content.WaitContent</class> <class>call.structure.content.TextContent</class> <class>call.structure.content.VariableContent</class> <class>call.structure.content.SoundContent</class> <class>call.structure.content.SubjectContent</class> <class>call.structure.content.FileContent</class> <class>call.structure.Bounce</class> <properties> <property name="javax.persistence.jdbc.url" value="jdbc:oracle:thin:@127.0.0.1:1521:TEST"/> <property name="javax.persistence.jdbc.password" value="userpassword"/> <property name="javax.persistence.jdbc.driver" value="oracle.jdbc.OracleDriver"/> <property name="javax.persistence.jdbc.user" value="username"/> </properties> </persistence-unit> </persistence> 我的线程的 run 函数中代码超时: private class TaskDB extends Thread { private final long WAITING_TIME = 20000L; @Override public void run() { Set<SmsTask> remove = SMSManager.this.getRemoveTask(); Set<SmsTask> normal = SMSManager.this.getNormalTask(); try { while(true){ EntityManager em = DB.getEM(); //Calls EntityManagerFactory.createEntityManager() em.getTransaction().begin(); Set<SmsTask> normalClone = new HashSet<SmsTask>(normal); // Abort task in futur. List<SmsTask> taskToRemove = new ArrayList<SmsTask>(); if (!remove.isEmpty()) { String queryString = "SELECT t FROM SmsTask t WHERE t.id IN :remove "; if (!normalClone.isEmpty()) queryString += "AND t.id NOT IN :normal "; Query query = em.createQuery(queryString); query.setParameter("remove", Utils.taskToIdList(remove)); if (!normalClone.isEmpty()) query.setParameter("normal", Utils.taskToIdList(normalClone)); taskToRemove = (List<SmsTask>) query.getResultList(); for (SmsTask task : taskToRemove) { removedTask.add(task); remove.remove(task); } } String queryString = "SELECT t FROM SmsTask t WHERE (t.scheduleTime IS NULL OR t.scheduleTime < :dateNow) AND t.status = co.dium.call.structure.Task.StatusTask.NOT_START "; if (!taskToRemove.isEmpty()) queryString += "AND t.id NOT IN :toRemove "; Query query = em.createQuery(queryString); query.setParameter("dateNow", Utils.obtainUniversalTime()); if (!taskToRemove.isEmpty()) query.setParameter("toRemove", Utils.taskToIdList(taskToRemove)); List<SmsTask> taskResults = (List<SmsTask>) query.getResultList(); em.getTransaction().commit(); for (SmsTask task : taskResults) addTask(task); SMSManager.TaskRemove.sleep(WAITING_TIME); } } catch (InterruptedException ex) { Logger.getLogger(SMSManager.class.getName()).log(Level.SEVERE, null, ex); } System.out.println("Thread interrompu !"); Thread.currentThread().interrupt(); } } 我得到的超时错误: org.clipse.persistence.exceptions.DatabaseException Internal Exception: java.sql.SQLRecoverableException: I/O error: Socket read timed out Error Code: 17002 Call: [....sql query...] [...] at org.eclipse.persistence.internal.EJBQueryImpl.getResultList(EJBQueryImpl.java:742) at call.manager.sms.SMSManager$TaskDB.run(SMSManager.java:367) Caused by: java.sql.SQLRecoverableException: I/O Error: Scoket read timed out [...] 是的,有javax.persistence.query.timeout。根据 JPA 2.0 规范,对此查询提示的支持是可选的: 便携式应用程序不应依赖此提示。取决于 正在使用的持久性提供程序和数据库,提示可能会也可能不会 观察到。 可以将所有查询的默认值(以毫秒为单位)设置为 persistence.xml: <property name="javax.persistence.query.timeout" value="1000"/> 通过 Persistence 创建 EntityManagerFactory 时也可以给出相同的属性。createEntityManagerFactory。 它也可以根据查询被覆盖/设置: query.setHint("javax.persistence.query.timeout", 2000); 可以通过 NamedQuery 中的属性 hints 获得相同的功能。 有两种方法可以使用 Hibernate 设置查询超时时间。 Hibernate 特有的方式 如果您本地引导 Hibernate 或者将 JPA java.persistence.Query 解包为其 org.hibernate.query.Query 等效项,那么您只需使用 setTimeout 方法即可: List<Post> posts = entityManager.createQuery(""" select p from Post p where lower(p.title) like lower(:titlePattern) """, Post.class) .setParameter("titlePattern", "%Hibernate%") .unwrap(org.hibernate.query.Query.class) .setTimeout(1) .getResultList(); 请注意,setTimeout方法采用int参数,该参数指定以秒为单位的超时值。 JPA查询提示方式 您还可以使用 JPA 查询提示,如以下示例所示: List<Post> posts = entityManager.createQuery(""" select p from Post p where lower(p.title) like lower(:titlePattern) """, Post.class) .setParameter("titlePattern", "%Hibernate%") .setHint("javax.persistence.query.timeout", 50) .getResultList(); 请注意,javax.persistence.query.timeout查询提示采用以毫秒为单位的超时值。 Hibernate查询提示方式 您还可以使用org.hibernate.timeout查询提示: List<Post> posts = entityManager.createQuery(""" select p from Post p where lower(p.title) like lower(:titlePattern) """, Post.class) .setParameter("titlePattern", "%Hibernate%") .setHint("org.hibernate.timeout", 1) .getResultList(); 请注意,org.hibernate.timeout查询提示采用以秒为单位的超时值。 您应该使用“javax.persistence.query.timeout”,而不是使用查询提示“javax.persistence.lock.timeout”。 在后一种情况下,如果查询未在指定毫秒内返回,您将收到 CannotAcquireLockException。在第一种情况下,如果事务没有在指定的毫秒内完成,您将收到 QueryTimeoutException 并且事务将被回滚。

回答 3 投票 0

@SqlResultSetMapping 和 ConstructorResult 使用 BeanProperty 检查所有字段

我有一个旧应用程序,它使用带有本机查询的实体管理器。这些实体使用 @SqlResultSetMapping 进行注释,并使用 @ConstructorResult。该应用程序运行良好...

回答 1 投票 0

Spring Data JPA/Hibernate:JPQL 构造函数表达式 - 使用“new(..)”和不使用它之间的区别

我正在使用 JPQL 并将特定返回的字段投影到与实体不同的类中。我可以在 JPQL 中使用 EntityManger 至少使用以下 2 种方法来实现它(在代码中):- @测试

回答 1 投票 0

获取异常“分离实体传递到持久化”

我正在尝试使用单个事务使用实体管理器删除旧的子实体、创建新的子实体、更新祖父母实体。下面是我的代码: 实体类 @数据 @实体 @

回答 1 投票 0

获取“java.lang.IllegalArgumentException:删除分离的实例”

我正在尝试使用实体管理器删除实体。以下是我的课程: 实体类 @数据 @实体 @NoArgs构造函数 @AllArgsConstructor @Table(name = "GrandParent", schema = "

回答 1 投票 0

EntityManager 和持久性上下文的意外行为

我目前正在尝试学习 JPA 和 Hibernate,并且一直在尝试一些虚拟代码来了解一切是如何工作的。然而,我想出了一个我不太明白的例子

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.