Tag: jpa

编译查询时出错:抽象模式类型“实体”未知

我正在开发一个带有数据库连接的游戏,我使用JPA来保存我的数据。 这是我的游戏实体: @Entity @Table(name = “game”) public class Game implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = “game_id”) private int id; @Column(name = “name”) private String name; @Column(name = “nbTurns”) private int nbTurns; @Column(name = “playedOn”) @Temporal(TemporalType.TIMESTAMP) private Date playedOn; @ElementCollection(fetch = FetchType.EAGER) @CollectionTable(name = “game_humans”, joinColumns […]

使用JPQL / HQL在JPA中对连接提取集合进行排序

鉴于以下JPQL语句,我如何修改它,以便结果列表中的小猫按其age属性排序? SELECT c FROM Cat c left join fetch c.kittens WHERE c.id = :id 我尝试了多个approches,但没有任何运气。 这基本上是我想要做的,但它不起作用: SELECT c FROM Cat c left join fetch c.kittens k WHERE c.id = :id ORDER BY k.age

JPA / Hibernate使用共享主键进行单向一对一映射

我正在努力获得与JPA(提供者:Hibernate)一起使用的单向一对一关系。 在我看来,这不应该是一个麻烦,但显然JPA / Hibernate不同意这一点;-) 问题是我必须映射一个我无法更改的遗留模式,并且此模式在两个实体之间使用共享主键,同时它是一个实体的外键。 我创建了一个简单的TestCase: DB如下所示: CREATE TABLE PARENT (PARENT_ID Number primary key, Message varchar2(50)); CREATE TABLE CHILD (CHILD_ID Number primary key, Message varchar2(50), CONSTRAINT FK_PARENT_ID FOREIGN KEY (CHILD_ID )REFERENCES PARENT (PARENT_ID)); CREATE SEQUENCE SEQ_PK_PARENT START WITH 1 INCREMENT BY 1 ORDER; 父母(=一对一的拥有方)如下所示: @Entity @Table(name = “PARENT”) public class Parent implements java.io.Serializable { private […]

Embeddable类中的外键映射

我正在使用eclipselink进行JPA 。 我有一个实体,它有一个由两个字段组成的复合键 。 以下是我的可嵌入主键类’字段(成员)。 @Embeddable public class LeavePK { @ManyToOne(optional = false) @JoinColumn(name = “staffId”, nullable = false) private Staff staff; @Temporal(TemporalType.TIMESTAMP) private Calendar date; //setters and getters } 我的实体将保留与员工相关的休假数据,因此我尝试将员工对象和离开日期结合起来以生成组合键。 除了我的逻辑,它不允许我在嵌入类中有一个外键映射。 当我尝试使用JPA工具 – >从实体生成表时 ,它会给出如下错误,这解释了,但我没有得到它。 org.eclipse.persistence.exceptions.ValidationException Exception Description: The mapping [staff] from the embedded ID class [class rs.stapp.entity.LeavePK] is an invalid mapping for this […]

我可以在Hibernate管理的表中添加“ON DELETE CASCADE”吗?

我有一些由Hibernate管理的表,有各种外键约束。 Cascade on delete目前仅由Hibernate管理。 为了解决测试数据,我经常手动创建和删除一些行。 如果我可以将ON DELETE CASCADE添加到外键约束中,那将对我有很大帮助,但我不知道Hibernate是否因为数据库在Hibernate之前移除了东西而绊倒了。 很多人似乎都专注于DDL。 我的目的不是指示Hibernate使用SQL DELETE CASCADES创建DDL。 我只是想知道如果我在数据库中指定ON DELETE CASCADE 除了在参考注释上具有JPA的cascade = CascadeType.REMOVE (例如@ManyToOne 之外是否有任何伤害。

仅在确定要提交但在提交之前拦截事务

Context是Java – 带有Hibernate和Spring的JPA。 我们来看两阶段提交协议的场景(但只有一个资源): 查询从应用程序提交 投票是/否(在我们的案例中来自数据库) 3.1。 如果是,来自数据库 3.1.1。 ( 在代码中进行回调 ) – 不是协议的一部分 3.1.2。 提交数据库 3.2如果没有 3.2.1回滚到数据库 我想要的是一种在代码中从3.1.1进行回调的方法,但只有当知道事务将被提交但在实际提交之前。 此外,如果在此处抛出exception,则应回滚该事务。 使用Spring的TransactionSynchronization (*),允许您在事务提交/完成之前或提交/完成之后拦截事务。 beforeCommit()回调表示在调用方法后仍然可以发生回滚; 即使事务失败,也会调用beforeComplete() 在事务实际提交到数据库之后afterCommit/Complete()并且无法回滚。 现在我看起来似乎我想要的是另一个完整的两阶段提交协议; 但我想知道Spring中是否有解决方法。 区别在于回调中完成的调用无法回滚。 来自Spring 4.2的(*)与@TransactionalEventListener和TransactionPhase非常简单,它很好地抽象了TransactionSynchronization

如何使用@OneToMany集合进行分页

假设我有一个Post实体和一个Comment实体以及一对多的关系: @Entity class Post { … @OneToMany List comments; … } 我怎样才能实现这样的分页: Post post = //Find the post. return post.getComments().fetch(100, 10); // Find the 11th page (page size 10); 是否可以在JPA之上使用@OneToMany集合模拟动态分页,还是我们必须完全重写JPA的关联机制? (例如,创建一个可以管理分页,排序和搜索的PersistentList集合类型)。 PS:我最近发现了Play! 框架在JPA:Siena之上使用了一个非常有趣的库。 Siena非常易于使用,并且在JPA / Hibernate之上是一个很好的抽象。 但我找不到如何使用其关联进行分页。 更新: Play框架具有类似于Django的查询语法: Post.findAll().from(100).fetch(10); // paging 哪里 Post.findAll() 将返回一个JPAQuery对象,一个Play中的自定义查询类型。 但是有关联的集合,例如: Post.comments 将只返回一个List,它不支持分页或其他查询。 我想知道如何扩展它,所以 Post.comments 还将返回一个JPAQuery对象或类似的东西,然后你可以查询“查询”集合: Post.comments.from(100).fetch(10); 或插入新的评论而不实际获取任何评论: Post.comments.add(new Comment(…)); […]

Hibernate:在类上使用mappedBy扩展另一个注释为JoinedSubclass的类?

以下不起作用: @Entity class Owner { @OneToMany(mappedBy=”owner”, cascade = {CascadeType.ALL}) protected Set getBSet() { .. } } @Entity @Inheritance(strategy=InheritanceType.JOINED) class A { @ManyToOne public Owner getOwner() { … } } @Entity class B extends A { } 它会导致exception:org.hibernate.AnnotationException:mappedBy引用未知的目标实体属性:所有者中的B.user。 我试图避免将“owner”属性复制到B类(因此将“非规范化”并将所有者密钥复制到为实体A和B生成的两个表中)。 另外,我真的希望将A和B放在一个单独的表中,而不必使用SingleTableinheritance来使用鉴别器。 另外,我无法弄清楚如何通过在A和B之间使用@OneToOne来做类似的事情(并且没有B扩展A)。

从JPA级别选择更新跳过锁定

在我的应用程序 – 带JPA的Oracle(EclipseLink)中,我使用以下表达式来锁定某些表中的记录子集: select * from MY_TABLE where MY_CONDITIONS for update skip locked 我在本机查询中运行它,但我必须为所有必需的实体编写该查询。 有没有办法使用纯JPA跳过锁定的记录? 我可以实施自己的锁定政策吗? 我不介意更改JPA提供程序,但我想使用JPA API。

是否应该在equals和hashCode中考虑JPA实体的id字段?

我在使用JPA2和EclipseLink编写数据库应用程序的测试时遇到了问题: 我将一些实体添加到数据库中,稍后检索它并希望将它与具有我期望确认添加按预期工作的值的实例进行比较。 首先我写了类似的东西 assertEquals(expResult, dbResult); 哪个失败了,因为我真的不知道id字段的值,它是由数据库生成的,因此dbResult与我用new和手动填充创建的dbResult不同。 我看到两个选择: 要么我从equals和hashCode删除id字段,以便比较仅基于“实际值”。 不过,我不知道这是否会导致数据库或其他地方出现问题。 或者我编写测试以手动显式检查除id之外的每个字段。 我该怎么办?