天道酬勤,学无止境

hibernate

休眠 mysql innodb(Hibernate mysql innodb)

问题 我想强制休眠使用 innodb。 因此,我更改了“hibernate.dialect”以拥有 innodb,但我可以连接到 mysql,但是当我执行某些事务时,出现以下错误: org.springframework.transaction.TransactionSystemException: 无法提交 JPA 事务; 嵌套异常是 javax.persistence.RollbackException: Transaction 标记为 roll lbackOnly at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:465) at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java 709) 在 org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:678) 在

2021-09-21 18:48:09    分类:技术分享    java   mysql   hibernate   orm   dialect

如何在运行时配置 JPA 表名?(How do I configure JPA table name at runtime?)

问题 我有一个问题,我只有一个数据库可以使用,但我有多个服务器,我希望它们为每个服务器使用不同的表名。 现在我的班级配置为: @Entity @Table(name="loader_queue") class LoaderQueue 例如,我希望能够让 dev1 服务器指向 loader_queue_dev1 表,而 dev2 服务器指向 loader_queue_dev2 表。 有没有办法在使用或不使用注释的情况下做到这一点? 我希望能够有一个单一的构建,然后在运行时使用类似系统属性的东西来更改该表名。 回答1 对于 Hibernate 4.x,您可以使用自定义命名策略,在运行时动态生成表名。 服务器名称可以由系统属性提供,因此您的策略可能如下所示: public class ServerAwareNamingStrategy extends ImprovedNamingStrategy { @Override public String classToTableName(String className) { String tableName = super.classToTableName(className); return resolveServer(tableName); } private String resolveServer(String tableName)

2021-09-21 17:33:57    分类:技术分享    java   hibernate   jpa   orm   hibernate-mapping

batch insert/update in hibernate mysql(batch insert/update in hibernate mysql)

问题 我们正在使用容器管理的事务。 应用服务器 JBOSS AS7。 我在休眠配置文件中启用了以下属性 <property name="hibernate.connection.url">jdbc:mysql://localhost/test?rewriteBatchedStatements=true</property> <property name="hibernate.jdbc.batch_size" value="20"/> <property name="hibernate.order_inserts" value="true"/> <property name="hibernate.order_updates" value="true"/> <property name="hibernate.jdbc.batch_versioned_data" value="true"/> 并启用日志属性如下 <logger category="org.hibernate.SQL"> <level name="TRACE"/> </logger> 我正在向数据库中插入 10 条记录。 在 hibernate.log 中,我可以看到 10 个插入语句如下 org.hibernate.sql insert into test (name,value,date) values (?,?,?)

2021-09-21 17:31:44    分类:技术分享    mysql   hibernate

如果我修改了一个 Hibernate 实体,在保存后,当我提交时,更改会被保存到数据库中(If I modify a Hibernate entity, after doing a save, when I commit would the changes be saved to the database)

问题 如果在 Hibernate 中,我执行以下步骤: 打开一个会话。 创建一个新的hibernate POJO 对象(即要保存),并填写值。 现在我做 session.save()。 现在我更改 POJO 对象 - 假设它是一个员工对象,我执行 emp.setName("Other Name") 即更改对象中员工的姓名。 现在我做了一个事务提交。 我的问题是什么会被保存到数据库中——我做 session.save() 之前的名称还是更改后的名称,即“其他名称”? 回答1 保存实体的那一刻,它就成为托管的,所有进一步的更改都会在Session.flush期间传播到数据库。 当您保存实体时,您只触发了一个EntityInsertAction排队。 更改实体后,当前实体状态已更改,因此在刷新期间,Hibernate 将简单地插入最新的实体状态,因此数据库将包含"Other Name" 。 实际上,为托管实体(触发实体合并)调用save类的方法实际上会影响性能。 回答2 在使用托管实体时,当您不调用 save 时,它​​将自动保存。 回答3 一旦您进行事务提交,您在会话中所做的一切都会提交到数据库中。 即使您刷新会话,您也只是在内存中的表上添加更改,但没有提交到数据库。 所以最后,一旦 Hibernate 检测到会话是脏的,它就会提交更改,以防您的配置中有自动污垢检查

2021-09-21 16:54:22    分类:技术分享    java   database   hibernate   orm

为什么在此处发出“显示警告”查询? (JPA/休眠/MySQL)(Why is 'SHOW WARNINGS' query issued here? (JPA/Hibernate/MySQL))

问题 我们正在将 Java 应用程序的持久层从 JDBC 模板重构为 JPA/Hibernate。 我正在分析向数据库发出的 SQL 语句,我看到多次发出“显示警告”。 根据 JProfiler 的说法,“显示警告”占用了大量的“固有时间”。 什么会导致如此频繁地发出显示警告? 以前使用 Jdbc 模板时未发出此显示警告。 下面是我们堆栈中与持久性相关的部分。 这里唯一的变化是引入了 JPA/Hibernate。 JPA/休眠:4.3.6 MySQL 驱动程序:5.1.33 MySQL 数据库:5.6.20 JDBC 连接池:HikariCP-2.3.2 编辑:这是发出 SHOW WARNINGS 时的示例堆栈跟踪。 com.mysql.jdbc.StatementImpl.getWarnings() com.zaxxer.hikari.proxy.PreparedStatementJavassistProxy.getWarnings() org.hibernate.jpa.internal.QueryImpl.getSingleResult() com.mysema.query.jpa.impl.AbstractJPAQuery.getSingleResult(javax.persistence.Query) com.mysema.query.jpa.impl

2021-09-21 16:09:45    分类:技术分享    mysql   hibernate   jpa   hikaricp

Hibernate 二级缓存和数据库模式中的 ON DELETE CASCADE(Hibernate second level cache and ON DELETE CASCADE in database schema)

问题 我们的 Java 应用程序有大约 100 个映射到数据库(SQL Server 或 MySQL)的类。 我们使用 Hibernate 作为我们的 ORM(带有 XML 映射文件)。 我们在数据库模式中指定FOREIGN KEY约束。 我们的大多数FOREIGN KEY约束也指定ON DELETE CASCADE 。 我们最近开始启用 Hibernate 2nd 级缓存(用于流行的实体和集合)以缓解一些性能问题。 自从我们启用二级缓存后,性能有所提高。 然而,我们也开始遇到 ObjectNotFoundExceptions。 似乎发生 ObjectNotFoundExceptions 是因为数据库正在删除 Hibernate下的表行。 例如,当我们使用 Hibernate 删除Parent时,数据库模式将ON DELETE CASCADE到任何Child实体。 这显然不发生知识Hibernate的,所以也没有得到一个机会来更新二级缓存(并删除所有已删除的Child实体)。 我们相信这个问题的解决方案是从我们的数据库模式中删除ON DELETE CASCADE (但保留FOREIGN KEY s)。 相反,我们需要配置 Hibernate 以使用普通的删除 SQL 删除Child依赖项,这也会使 Hibernate 更新二级缓存。 一些有限的测试表明这种方法似乎有效。

2021-09-21 14:43:12    分类:技术分享    java   hibernate   foreign-keys   second-level-cache

接受 %% 值的休眠条件(Hibernate criteria accepting %% value)

问题 我正在使用以下 Hibernate 代码来过滤workFlowName 。 crt.add(Restrictions.like("workFlowName", workFlow, MatchMode.ANYWHERE)); // crt is the criteria 问题是当我将值从 web (TextBox) 传递给workFlow 时,它正确地获取了值(如果获取 10 条记录,我将在文本框中传递sym 。如果我再次传递相同的值,如%sym% ,它将获取相同的记录)。 当它看到%%作为参数时,标准是否会省略? 回答1 Hibernate 不会转义像中的特殊字符(例如百分比%符号)。 但是有描述如何解决它(逃避它) : 在 Hibernate 查询中转义特殊字符使用休眠标准,有没有办法转义特殊字符? 转义休眠条件中的特殊字符 一般来说,我们可以实现我们自己的EscapedILikeExpression (取自上面的第一个链接) class EscapedILikeExpression extends IlikeExpression { private static final String HIBERNATE_ESCAPE_CHAR = "\\"; public EscapedILikeExpression(String propertyName, Object value

2021-09-21 14:06:28    分类:技术分享    java   hibernate   jakarta-ee   orm   hibernate-criteria

从另一个 docker 容器连接到数据库(Connect to database from another docker container)

问题 我运行了两个 docker 容器,一个是 tomcat,一个是 phpmyadmin。 我用这个命令运行了 phpmyadmin 容器: docker run -d -p 49160:22 -p 49161:80 -p 49162:3306 --name db phpmyadmin:imported 我可以在浏览器的 49161 端口上看到 phpmyadmin。我用这个命令运行了 tomcat 容器 docker run -it -v ~/docker/tomcat/tomcat-users.xml:/usr/local/tomcat/conf/tomcat-users.xml --name tomcat --link db:server -p 8888:8080 tomcat:deployed 每件事看起来都很好。 我可以从 tomcat 容器 ping 数据库。 但是当我尝试使用 hibernate 和我的 J2EE 应用程序连接到它时,我收到以下错误。 10-Jun-2015 19:20:12.293 WARNING [http-nio-8080-exec-15] org.hibernate.cfg.SettingsFactory.buildSettings Could not obtain connection metadata java.sql

2021-09-21 12:13:49    分类:技术分享    hibernate   tomcat   docker

如何在 Hibernate Search/Lucene 中禁用默认评分/提升?(How to disable default scoring/boosting in Hibernate Search/Lucene?)

问题 我想为我的用户提供最相关和最好的结果。 例如,我奖励具有大标题、描述、附加照片等的记录。对于上下文:记录是自行车路线,具有路线点(坐标)和元数据,如照片、评论等。 现在,我使用Hibernate对这些记录进行了索引,然后在Hibernate Search使用Lucene在索引中进行Hibernate Search 。 为了给我的结果打分,我根据文档属性构建查询并在should BooleanJunction clause提升它们(使用boostedTo() ): bj.should(qb.range().onField("descriptionLength").above(3000).createQuery()).boostedTo(3.0f); bj.should(qb.range().onField("views.views").above(5000).createQuery()).boostedTo(3.0f); bj.should(qb.range().onField("nameLength").above(20).createQuery()).boostedTo(1.0f); bj.should(qb.range().onField("picturesLength").above(0).createQuery()).boostedTo(5.0f); bj

2021-09-21 10:35:15    分类:技术分享    java   hibernate   indexing   lucene   hibernate-search

Spring JPA - 枚举中枚举字段的默认值(Spring JPA - default value for enum field in enum)

问题 我们有一个带有 enum 字段的实体 - emailCommunicationStatus ,我们想使用 JPA 注释为它设置一个默认值 - 'UNKNOWN' 。 但是,当我们将实体保存到 DB 时,该字段的值为null而不是 。 对于布尔字段 - isLocked保存正确的默认值 ( false )。 @Entity public class Account { @Id @GeneratedValue @Column(name = "id") protected Long id; @Column(columnDefinition = "boolean default false") private boolean isLocked; @Column(length = 32, columnDefinition = "varchar(32) default 'UNKNOWN'") @Enumerated(value = EnumType.STRING) private CommunicationStatus emailCommunicationStatus; PlayerAccount() { super(); } } public enum CommunicationStatus { VALID, INVALID, DONT_CONTACT, UNKNOWN; }

2021-09-21 10:26:35    分类:技术分享    java   spring   hibernate   jpa   enums