Tag: orm

Hibernate可以使用MySQL的“ON DUPLICATE KEY UPDATE”语法吗?

MySQL支持“ INSERT … ON DUPLICATE KEY UPDATE … ”语法,允许您“盲目地”插入数据库,并回退到更新现有记录(如果存在)。 当您需要快速事务隔离并且要更新的值依赖于数据库中已有的值时,这非常有用。 作为一个人为的例子,假设您想要计算在博客上查看故事的次数。 使用此语法执行此操作的一种方法可能是: INSERT INTO story_count (id, view_count) VALUES (12345, 1) ON DUPLICATE KEY UPDATE set view_count = view_count + 1 这比开始交易更有效,更有效,并处理新故事登上头版时发生的不可避免的exception。 我们如何使用Hibernate做同样的事情或实现相同的目标? 首先,Hibernate的HQL解析器将抛出exception,因为它不了解特定于数据库的关键字。 实际上,HQL不喜欢任何显式插入,除非它是“ INSERT … SELECT …. ”。 其次,Hibernate将SQL限制为仅选择。 如果您尝试调用session.createSQLQuery(“sql”).executeUpdate() Hibernate将抛出exception。 第三,在这种情况下,Hibernate的saveOrUpdate不符合要求。 您的测试将通过,但如果您每秒有多个访问者,则会导致生产失败。 我真的要颠覆Hibernate吗?

Hibernate支持Postgresql UUID?

我不能让Hibernate使用java.util.UUID for PostgreSQL。 这是使用javax.persistence的映射。* annotations: private UUID itemUuid; @Column(name=”item_uuid”,columnDefinition=”uuid NOT NULL”) public UUID getItemUuid() { return itemUuid; } public void setItemUuid(UUID itemUuid) { this.itemUuid = itemUuid; } 当持久化对象时,我得到一个SQLGrammarException: column “item_uuid” is of type uuid but expression is of type bytea at character 149 PostgreSQL版本是8.4.4 JDBC驱动程序 – 8.4.4-702(也试过9.0 – 同样的事情) Hibernate版本是3.6,主要配置属性: org.hibernate.dialect.PostgreSQLDialect org.postgresql.Driver jdbc:postgresql://192.168.1.1/db_test

Hibernate命名查询顺序依据参数

嗨,任何人都可以指出我们如何将order by子句作为命名参数传递给hql 例如: 作品: select tb from TransportBooking as tb and TIMESTAMP(tb.bookingDate, tb.bookingTime) >= current_timestamp() order by tb.bookingDate 不起作用: select tb from TransportBooking as tb and TIMESTAMP(tb.bookingDate, tb.bookingTime) >= current_timestamp() order by :order

Hibernate使用PostgreSQL序列不会影响序列表

我已将Hibernate配置为使用PostgreSQL序列(通过注释)为主键id列生成值,如下所示: @Id @SequenceGenerator(name=”pk_sequence”,sequenceName=”entity_id_seq”) @GeneratedValue(strategy=GenerationType.SEQUENCE,generator=”pk_sequence”) @Column(name=”id”, unique=true, nullable=false) public int getId() { return this.id; } 我在这个配置中看到的是,hibernate已经在持久化时分配了id值> 3000,而对使用过的序列的查询显示如下: database=# select last_value from entity_id_seq; last_value ———— 69 (1排) 问题: 有什么不对吗? hibernate应该与序列表同步吗? 如果没有,它在哪里存储最后生成的ID? 谢谢。

项目中hibernate.cfg.xml的位置?

我创建了一个具有以下结构的项目: HibernateUtil中: public class HibernateUtil { private static final SessionFactory sessionFactory = buildSessionFactory(); private static SessionFactory buildSessionFactory() { try { // Create the SessionFactory from hibernate.cfg.xml Configuration configuration = new Configuration().configure( “C:\\Users\\Nikolay_Tkachev\\workspace\\hiberTest\\src\\logic\\hibernate.cfg.xml”); return new Configuration().configure().buildSessionFactory(); } catch (Throwable ex) { // Make sure you log the exception, as it might be swallowed System.err.println(“Initial SessionFactory creation […]

在视图模式中打开会话

鉴于我选择的JPA(Hibernate实现),Spring和,我问这个问题。 我一直在考虑我的实体层中的关系 – 例如我有一个订单实体,它有许多订单行。 我已经设置了我的应用程序,因此它急切地为每个订单加载订单行。 如果我将获取策略设置为false,你认为这是一种懒惰的方法来解决我会遇到的延迟初始化问题吗? 我看到它的方式,在检索实体及其关联时,我有以下备选方案: 使用Open Session In View模式为每个请求创建会话,并在返回响应之前提交事务。 实现DTO(数据传输对象)层,以便我执行的每个DAO查询都返回正确初始化的DTO以用于我的目的。 我真的不太喜欢这个选项,因为根据我的经验,我发现它创建了许多样板复制代码并且变得很难维护。 不要映射JPA中的任何关联,以便我执行的每个查询都只返回我感兴趣的实体 – 这可能要求我无论如何都要使用DTO,这将是一个难以维护的问题,我认为无法实现ORM的目的首先。 急切地获取所有(或大多数关联) – 在上面的示例中,总是在检索订单时获取所有订单行。 所以我的问题是,你何时以及在什么情况下会使用哪些选项? 你总是坚持一种做法吗? 我会问一位同事,但我认为,如果我甚至提到“开放式会议”这一术语,我会受到一片空白的欢迎:(我真正想要的是来自资深或经验丰富的开发人员的一些建议。 多谢你们!

JPA和Hibernate中N + 1问题的解决方案是什么?

我知道N + 1问题是执行一个查询以获取N个记录和N个查询以获取一些关系记录。 但是如何在Hibernate中避免它呢?

如何使用Hibernate @ Any-related注释?

有人可以向我解释任何相关的注释( @AnyMetaDef , @AnyMetaDefs @AnyMetaDef , @AnyMetaDefs和@ManyToAny )如何在实践中发挥作用。 我很难找到任何有用的文档(仅JavaDoc并不是很有帮助)。 到目前为止,我已经收集到它们以某种方式启用对抽象和扩展类的引用。 如果是这种情况,为什么没有@OneToAny注释? 这个“任何”指的是单个“任何”或多个“任何”吗? 一个简短,实用和说明的例子将非常受欢迎(不必编译)。 编辑:尽管我希望接受回复作为答案并给予应有的信用,但我发现Smink和Sakana的答案都提供了丰富的信息。 因为我不能接受几个回复作为答案 ,遗憾的是我不会将其作为答案。