Tag: hibernate

在纯JPA设置中获取数据库连接

我们有一个JPA应用程序(使用hibernate),我们需要传递一个需要JDBC数据库连接作为参数的传统报告工具。 有一个简单的方法来获得访问的JDBC连接hibernate设置?

Spring Boot + JPA:忽略列名称注释

我有一个Spring引导应用程序依赖“spring-boot-starter-data-jpa”。 我的实体类具有列名称的列注释。 例如: @Column(name="TestName") private String testName; 由此创build的test_name作为列名生成的SQL。 find解决scheme后,我发现spring.jpa.hibernate.naming_strategy=org.hibernate.cfg.EJB3NamingStrategy解决了问题(列名取自列注释)。 不过,我的问题是,为什么没有将naming_strategy设置为EJB3NamingStrategy JPA忽略了列注释? 也许冬眠方言有什么关系呢? 我正在连接到MS SQL 2014 Express,我的日志包含: Unknown Microsoft SQL Server major version [12] using SQL Server 2000 dialect Using dialect: org.hibernate.dialect.SQLServerDialect

如何在连接和基于行的限制(分页)中获得不同的结果?

我试图使用基于行的限制(例如: setFirstResult(5)和setMaxResults(10) )对已经连接到其他表的Hibernate Criteria查询实现分页。 可以理解的是,数据随机被切断; 原因在这里解释。 作为解决scheme,页面build议使用“第二个sql select”而不是联接。 如何将我现有的标准查询(使用createAlias()连接)转换为使用嵌套的select?

JPA:迭代大型结果集的正确模式是什么?

比方说,我有一个数百万行的表。 使用JPA,迭代对该表的查询的正确方法是什么,这样我就不会拥有数百万个对象的所有内存列表 ? 例如,如果桌子很大,我怀疑以下情况会炸毁: List<Model> models = entityManager().createQuery("from Model m", Model.class).getResultList(); for (Model model : models) { System.out.println(model.getId()); } 是分页(循环和手动更新setFirstResult() / setMaxResult() )真的是最好的解决scheme? 编辑 :我要定位的主要用例是一种批处理作业。 如果运行时间很长,这很好。 没有涉及networking客户端; 我只需要为每一行“做一些事情”,一次一个(或者一些小N)。 我只是想尽量避免让他们在记忆中。

在JPA / Hibernate中正确使用flush()

我正在收集有关flush()方法的信息,但是我不清楚何时使用它以及如何正确使用它。 从我读到的内容来看,我的理解是持久化上下文的内容将与数据库同步,即发出未完成的语句或刷新实体数据。 现在我有两个实体A和B (一对一的关系,但没有强制执行或由JPAbuild模)的以下情况。 A有一个手动设置的组合PK,还有一个自动生成的IDENTITY字段recordId 。 这个recordId应该写入实体B作为A一个外键。 我在一次交易中保存A和B 问题是自动生成的值A.recordId在事务中不可用,除非在A上调用em.persist()之后,明确调用em.flush() 。 (如果我有一个自动生成的IDENTITY PK,那么值直接在实体中更新,但这不是这种情况。) 在事务中使用em.flush()会造成什么危害?

如何在JPA(和相应的连接表行)中删除具有ManyToMany关系的实体?

假设我有两个实体:组和用户。 每个用户可以是多个组的成员,每个组可以有多个用户。 @Entity public class User { @ManyToMany Set<Group> groups; //… } @Entity public class Group { @ManyToMany(mappedBy="groups") Set<User> users; //… } 现在我想删除一个组(假设它有很多成员)。 问题是当我在某个Group上调用EntityManager.remove()时,JPA提供者(在我的情况下是Hibernate) 不会从连接表中删除行,并且由于外键约束,删除操作失败。 在用户上调用remove()可以正常工作(我想这与拥有关系的一方有关)。 那么在这种情况下我该如何删除一个组? 我唯一能想到的方式是加载组中的所有用户,然后为每个用户从他的组中删除当前组并更新用户。 但是,对于我来说,只要能够删除这个组就可以调用组中的每个用户的update(),这似乎是荒谬的。

@GeneratedValue在MySQL上的多态抽象超类

在使用Hibernate和MySQL的Spring MVC应用程序中,我有一个抽象超类BaseEntity ,它pipe理模型中所有其他实体的ID的值。 id字段使用@GeneratedValue 。 每当我的代码尝试保存任何扩展BaseEntity的子类时,都遇到问题。 问题出现在@GeneratedValue的GenerationType的select上。 在我的代码中BaseEntity一个子类试图保存到底层MySQL数据库的每一个地方,我得到以下错误: ERROR SqlExceptionHelper – Table 'docbd.hibernate_sequences' doesn't exist 我已经阅读了许多关于这个在谷歌上的post,但是他们要么处理其他数据库(不是MySQL),要么处理抽象的超类。 我不能通过使用GenerationType.IDENTITY来解决问题,因为我正在使用抽象超类来pipe理模型中所有实体的id字段。 同样,我不能使用GenerationType.SEQUENCE因为MySQL不支持序列。 那么我该如何解决这个问题呢? 这里是BaseEntity.java的代码: @Entity @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) public abstract class BaseEntity { @Id @GeneratedValue(strategy = GenerationType.TABLE) protected Integer id; public void setId(Integer id) {this.id = id;} public Integer getId() {return id;} public boolean isNew() {return (this.id == null);} […]

努力去理解EntityManager的正确使用

我正在开始一个新的项目,我完全不熟悉JPA / Hibernate的使用。 我想了解如何正确使用EntityManager。 更确切地说,什么时候将其实例化,我需要多less,我是否应该closures它们,我应该把所有事情都交易吗? 无论如何,在我当前的代码中,当试图读取一个我以前保存的实体时,我得到了一个org.hibernate.LazyInitializationException。 我会理解相反的(阅读一个事务中的antity,然后试图将读取的实体保存在另一个事务中,但由于事务结束,实体是非托pipe的,因此保存失败),但是这个我不明白。 我把我的代码放在GitHub上( https://github.com/GaetanLeu/intl ),只是几个类。 我的主要是在src / sandbox / MessageSandbox.java,它在第28行失败,下面的stacktrace: Exception in thread "main" org.hibernate.LazyInitializationException: could not initialize proxy – no Session at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:164) at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:285) at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:185) at entity.MessageKey_$$_jvstfcc_0.toString(MessageKey_$$_jvstfcc_0.java) at java.lang.String.valueOf(String.java:2854) at java.lang.StringBuilder.append(StringBuilder.java:128) at com.google.common.base.Present.toString(Present.java:88) at java.lang.String.valueOf(String.java:2854) at java.io.PrintStream.println(PrintStream.java:821) at sandbox.MessageSandbox.main(MessageSandbox.java:28) 另外我从Hibernate得到了一个警告,说我的EntityManager已经存在,接下来会发生什么? EntityManagerFactory.createEntityManager方法是否返回现有的? WARN: HHH000436: Entity manager factory name […]

在HQL中执行date/时间math?

我正在寻找如何在HQL查询中执行date/时间math。 具体来说,如何从current_timestamp()函数的结果中增加或减去(x)时间量? 或者我不得不放弃到SQL这个,并希望无论数据库正在运行支持它? HQL查询示例: FROM RandomThing WHERE randomTime IS NOT NULL AND randomTime >= current_timestamp() AND randomTime <= (current_timestamp() + :timeToAdd) 我可以定义:timeToSubtract参数是任何特定的单位,虽然任何大于小时的将是不可取的,秒是最可取的。 澄清:我意识到这可以很容易地在查询之外完成。 但是出于哲学上的原因,让我们说使用数据库服务器的时间,而不是查询系统的时间是很重要的。 实际的例子:我正在查询在最后(x)时间内所做的所有条目的自动时间戳。 由于时间戳是由数据库系统创build的,所以同样要使用数据库的当前时间。

如何连接到Hibernate中的多个数据库

我是新的蜜蜂Hibernate和尝试的东西。 似乎有趣的一件事是如何连接到不同的数据库? 我在这里有两个问题: 如果在同一个Web应用程序中,我需要连接到MySQL和Oracle,我该怎么做? 我正在使用MySQL,并有两个数据库test1和test2,如何连接和检索数据? 我已经在博客中读过我们可以创build不同的configuration文件。 我尝试过,但没有成功。 这是我的尝试: SessionFactory sf = (SessionFactory) new Configuration().configure(path); 其中path是configuration文件的path。 这是正确的吗?