Tag: jpa

JPA OneToMany不删除孩子

我有一个父和@OneToMany之间简单的@OneToMany映射的问题。 一切正常,只有当我从集合中删除它们时,子logging才会被删除。 父母: @Entity public class Parent { @Id @Column(name = "ID") private Long id; @OneToMany(cascade = {CascadeType.ALL}, mappedBy = "parent") private Set<Child> childs = new HashSet<Child>(); … } 小孩: @Entity public class Child { @Id @Column(name = "ID") private Long id; @ManyToOne(cascade = CascadeType.ALL) @JoinColumn(name="PARENTID", nullable = false) private Parent parent; … } 如果我现在从子集Set中删除子元素,它不会从数据库中删除。 […]

@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 […]

什么是在Web应用程序中的jpa persistence.xml中引用jar文件的正确path?

persistence.xml如下所示: <persistence-unit name="testPU" transaction-type="RESOURCE_LOCAL"> <provider>org.hibernate.ejb.HibernatePersistence</provider> <non-jta-data-source>jdbc/test</non-jta-data-source> <jar-file>../../lib/app-services-1.0.jar</jar-file> <exclude-unlisted-classes>false</exclude-unlisted-classes> </persistence-unit> 这是一个Web项目,所以部署单位是一个战争文件。 我尝试引用的jar文件位于WEB-INF / lib /文件夹中, persistence.xml位于WEB-INF / classes / META-INF文件夹中。 部署时,它只是告诉我 “警告:无法find文件(忽略):file:… / .. / lib / app-services-1.0.jar”。 我也尝试了所有可能的path,比如../lib/app-services-1.0.jar,lib / app-services-1.0.jar 。 什么是正确的道路做到这一点?

如何使用延迟加载和分页查询Primefaces dataTable的数据

在我的JSF的数据表中,我实现了延迟加载,当我通过logging进行分页时,需要花费大约4或5秒的时间来执行下一组logging,实际上,执行结果应该花费不到一秒的时间。 这发生在我已经实施的方式,不知道我怎么能解决这个问题。 扩展了LazyDataModel的DataModel类 @Override public List<Request> load(int startingAt, int maxPerPage, String sortField, SortOrder sortOrder, Map<String, String> filters) { requestList = requestService.getRequest(startingAt, maxPerPage, sortField, sortOrder, filters); this.setRowCount(requestList.size()); if (requestList.size() > maxPerPage) { System.out.println("executing"); return requestList.subList(startingAt, startingAt + maxPerPage); } else { System.out.println("executing else "); return requestList; } return requestList; } 和dao课 @Override public List<Request> getRequest(int startingAt, […]

Hibernate 3.5中的JPA 2.0 @OrderColumn注释

我正在试图在Hibernate 3.5中使用@OrderColumn注解 @OneToMany(mappedBy = "parent",fetch=FetchType.EAGER, cascade=CascadeType.ALL) @OrderColumn(name = "pos") private List<Children> childrenCollection; 检索数据时,一切正常。 但是我不能使它重新排列列表中的元素并将新的顺序保存到数据库中。

Hibernate,@SequenceGenerator和allocationSize

当使用@SequenceGenerator时,我们都知道Hibernate的默认行为 – 它将实际的数据库序列增加1 ,将此值乘以50(默认的allocationSize值),然后将此值用作实体ID。 这是不正确的行为,并与说: allocationSize – (可选)从序列中分配序列号时要增加的数量。 要清楚:我不打扰生成的ID之间的差距。 我关心与底层数据库序列不一致的 ID。 例如:任何其他应用程序(例如使用普通JDBC)可能需要在从序列获得的ID下插入新行 – 但所有这些值可能已被Hibernate使用! 疯狂。 有人知道这个问题的任何解决scheme(没有设置allocationSize=1 ,从而降低性能)? 编辑: 把事情弄清楚。 如果最后插入的loggingID = 1 ,那么HB为其新实体BUT同时使用值51, 52, 53… :数据库中的序列值将被设置为2 。 当其他应用程序正在使用该序列时,这很容易导致错误。 另一方面:规范说(按照我的理解)数据库序列应该被设置为51 ,同时HB应该使用范围2, 3 … 50 更新: 正如Steve Ebersole在下面提到的:通过设置hibernate.id.new_generator_mappings=true可以启用我描述的行为(也是最直观的行为)。 谢谢你们。 更新2: 对于未来的读者,下面你可以find一个工作的例子。 @Entity @Table(name = "users") public class User { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "USERS_SEQ") @SequenceGenerator(name […]

JPQL IN子句:Java-数组(或列表,集合…)?

我想加载所有对象的文本标签设置为从我们的数据库中的任何一个小但任意数量的值。 在SQL中进行这种逻辑的方法是构build一个“IN”子句。 JPQL允许IN,但似乎要求我直接指定IN的每个参数(如in,“in(:in1,:in2,:in3)”)。 有没有一种方法来指定一个数组或应该展开为IN子句的值的列表(或其他容器)?

在App Engine模块之间共享实体

我正在从Eclipse迁移到Android Studio,并将Android应用程序连接到AppEngine。 我已经将服务器端分成两个模块(端点和面向用户的请求的默认模块)和后端的“pipe理员”模块。 现在这两个模块都需要使用实体。 (后端模块通常负责将这些实体保存到数据库,而前端默认模块是使用这些实体将数据返回给Android的人)。 在Android Studio中这两个模块之间共享这些实体类的最佳方式是什么? (也要确保这些类得到增强等)。 我不希望重复的类,在默认模块以及pipe理。 也许有一个共同的“java”模块之间共享(但不能确定类加强将工作)。 还是应该pipe理模块不使用实体,而是使用其他方式的持久性? 欣赏你的想法。

如何使用命名参数创build本机查询?

我想执行一个简单的本机查询,但它不起作用: @Autowired private EntityManager em; Query q = em.createNativeQuery("SELECT count(*) FROM mytable where username = :username"); em.setProperty("username", "test"); (int) q.getSingleResult(); 为什么我得到这个exception? org.hibernate.QueryException: Not all named parameters have been set: [username]