- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我尝试使用 hibernate 4.3.1.Final 在实体中保留 @ElementCollection
。该实体如下所示:
import javax.persistence.*;
import java.util.Map;
@Entity
public class MyEntity {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@ElementCollection
private Map<CompositeKey, CompositeValue> map;
@Embeddable
public static class CompositeKey {
@Basic
private Integer key1;
@Basic
private Integer key2;
}
@Embeddable
public static class CompositeValue {
@Basic
private Integer val1;
@Basic
private Integer val2;
}
}
Hibernate 正确生成架构:
create table MyEntity (id integer not null, primary key (id)) ENGINE=InnoDB;
create table MyEntity_map (MyEntity_id integer not null, val1 integer, val2 integer, key1 integer, key2 integer, primary key (MyEntity_id, key1, key2)) ENGINE=InnoDB;
create table ReferencedEntity (id integer not null, primary key (id)) ENGINE=InnoDB;
alter table MyEntity_map add constraint FK_mhu8q8dtieguddm0w4gxfwhnc foreign key (MyEntity_id) references MyEntity (id);
但是当我更改 CompositeKey
以引用另一个 Entity
时,当 hibernate 在启动时生成元模型时,我会收到 QueryException
。
更改后的代码:
@Embeddable
public static class CompositeKey {
@ManyToOne
private ReferencedEntity key1;
@Basic
private Integer key2;
}
引用的实体
:
import javax.persistence.*;
@Entity
public class ReferencedEntity {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
}
异常(exception):
Caused by: org.hibernate.QueryException: could not resolve property: key1 of: component[val1,val2]
at org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:83) ~[AbstractPropertyMapping.class:4.3.1.Final]
at org.hibernate.persister.entity.AbstractPropertyMapping.toColumns(AbstractPropertyMapping.java:98) ~[AbstractPropertyMapping.class:4.3.1.Final]
at org.hibernate.persister.collection.AbstractCollectionPersister.toColumns(AbstractCollectionPersister.java:1625) ~[AbstractCollectionPersister.class:4.3.1.Final]
at org.hibernate.loader.plan.build.internal.spaces.CompositePropertyMapping.toColumns(CompositePropertyMapping.java:124) ~[CompositePropertyMapping.class:4.3.1.Final]
at org.hibernate.loader.plan.build.internal.spaces.CompositeQuerySpaceImpl.toAliasedColumns(CompositeQuerySpaceImpl.java:52) ~[CompositeQuerySpaceImpl.class:4.3.1.Final]
at org.hibernate.loader.plan.build.internal.spaces.JoinImpl.resolveAliasedLeftHandSideJoinConditionColumns(JoinImpl.java:79) ~[JoinImpl.class:4.3.1.Final]
at org.hibernate.loader.plan.exec.internal.LoadQueryJoinAndFetchProcessor.addJoins(LoadQueryJoinAndFetchProcessor.java:261) ~[LoadQueryJoinAndFetchProcessor.class:4.3.1.Final]
at org.hibernate.loader.plan.exec.internal.LoadQueryJoinAndFetchProcessor.renderEntityJoin(LoadQueryJoinAndFetchProcessor.java:193) ~[LoadQueryJoinAndFetchProcessor.class:4.3.1.Final]
at org.hibernate.loader.plan.exec.internal.LoadQueryJoinAndFetchProcessor.renderJoin(LoadQueryJoinAndFetchProcessor.java:158) ~[LoadQueryJoinAndFetchProcessor.class:4.3.1.Final]
at org.hibernate.loader.plan.exec.internal.LoadQueryJoinAndFetchProcessor.processQuerySpaceJoin(LoadQueryJoinAndFetchProcessor.java:137) ~[LoadQueryJoinAndFetchProcessor.class:4.3.1.Final]
at org.hibernate.loader.plan.exec.internal.LoadQueryJoinAndFetchProcessor.processQuerySpaceJoins(LoadQueryJoinAndFetchProcessor.java:132) ~[LoadQueryJoinAndFetchProcessor.class:4.3.1.Final]
at org.hibernate.loader.plan.exec.internal.LoadQueryJoinAndFetchProcessor.processQuerySpaceJoin(LoadQueryJoinAndFetchProcessor.java:138) ~[LoadQueryJoinAndFetchProcessor.class:4.3.1.Final]
at org.hibernate.loader.plan.exec.internal.LoadQueryJoinAndFetchProcessor.processQuerySpaceJoins(LoadQueryJoinAndFetchProcessor.java:132) ~[LoadQueryJoinAndFetchProcessor.class:4.3.1.Final]
at org.hibernate.loader.plan.exec.internal.LoadQueryJoinAndFetchProcessor.processQuerySpaceJoins(LoadQueryJoinAndFetchProcessor.java:113) ~[LoadQueryJoinAndFetchProcessor.class:4.3.1.Final]
at org.hibernate.loader.plan.exec.internal.AbstractLoadQueryDetails.generate(AbstractLoadQueryDetails.java:171) ~[AbstractLoadQueryDetails.class:4.3.1.Final]
at org.hibernate.loader.plan.exec.internal.BasicCollectionLoadQueryDetails.<init>(BasicCollectionLoadQueryDetails.java:60) ~[BasicCollectionLoadQueryDetails.class:4.3.1.Final]
at org.hibernate.loader.plan.exec.internal.BatchingLoadQueryDetailsFactory.makeCollectionLoadQueryDetails(BatchingLoadQueryDetailsFactory.java:101) ~[BatchingLoadQueryDetailsFactory.class:4.3.1.Final]
at org.hibernate.loader.collection.plan.AbstractLoadPlanBasedCollectionInitializer.<init>(AbstractLoadPlanBasedCollectionInitializer.java:77) ~[AbstractLoadPlanBasedCollectionInitializer.class:4.3.1.Final]
at org.hibernate.loader.collection.plan.CollectionLoader.<init>(CollectionLoader.java:112) ~[CollectionLoader.class:4.3.1.Final]
at org.hibernate.loader.collection.plan.CollectionLoader$Builder.byKey(CollectionLoader.java:105) ~[CollectionLoader$Builder.class:4.3.1.Final]
at org.hibernate.loader.collection.plan.AbstractBatchingCollectionInitializerBuilder.buildNonBatchingLoader(AbstractBatchingCollectionInitializerBuilder.java:45) ~[AbstractBatchingCollectionInitializerBuilder.class:4.3.1.Final]
at org.hibernate.loader.collection.BatchingCollectionInitializerBuilder.createBatchingCollectionInitializer(BatchingCollectionInitializerBuilder.java:71) ~[BatchingCollectionInitializerBuilder.class:4.3.1.Final]
at org.hibernate.persister.collection.BasicCollectionPersister.createCollectionInitializer(BasicCollectionPersister.java:343) ~[BasicCollectionPersister.class:4.3.1.Final]
at org.hibernate.persister.collection.AbstractCollectionPersister.postInstantiate(AbstractCollectionPersister.java:676) ~[AbstractCollectionPersister.class:4.3.1.Final]
at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:484) ~[SessionFactoryImpl.class:4.3.1.Final]
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1857) ~[Configuration.class:4.3.1.Final]
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:850) ~[EntityManagerFactoryBuilderImpl$4.class:4.3.1.Final]
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:843) ~[EntityManagerFactoryBuilderImpl$4.class:4.3.1.Final]
at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.withTccl(ClassLoaderServiceImpl.java:399) ~[ClassLoaderServiceImpl.class:4.3.1.Final]
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:842) ~[EntityManagerFactoryBuilderImpl.class:4.3.1.Final]
at org.hibernate.jpa.HibernatePersistenceProvider.createContainerEntityManagerFactory(HibernatePersistenceProvider.java:150) ~[HibernatePersistenceProvider.class:4.3.1.Final]
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:336) ~[LocalContainerEntityManagerFactoryBean.class:4.0.1.RELEASE]
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:318) ~[AbstractEntityManagerFactoryBean.class:4.0.1.RELEASE]
...
我的映射出了什么问题?如何防止这种异常?
有趣的是,BasicCollectionPersister
似乎已正确初始化。调试表明,例如sqlUpdateRowString
是 update MyEntity_map set val1=?, val2=?其中 MyEntity_id=?和 key1_id=?和 key2=?
.
最佳答案
来自 JPA 2.0 规范:
Relationship mappings defined within an embedded id class are not supported.
另请参阅JPA - EmbeddedId with @ManytoOne .
编辑:
Hibernate 4.3.1.Final 实现了 JPA 2.1,所以我的第一个猜测是错误的。抱歉。
映射的问题在于使用了 @ElementCollection
以及引用实体 ReferencedEntity
的可嵌入 CompositeKey
。当 Hibernate 查找从 CompositeValue
(原文如此!)到 ReferencedEntity
的引用时,会引发 AbstractPropertyMapping
中的异常。然而,由于不存在这样的关系,因此抛出异常。对我来说,不清楚这是一个 Hibernate bug 还是根据 JPA 2.1 规范。
我看到以下解决方案。
解决方案1
将 CompositeKey
更改为添加 id
字段的 Entity
。在这种情况下,可以使用 @OneToMany
注释:
@Entity
public class CompositeKey {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@ManyToOne(targetEntity = ReferencedEntity.class)
private ReferencedEntity key1;
@Basic
private Integer key2;
}
解决方案2
添加一个附加实体 CompositeSampler
,其中包含 CompositeKey
作为 ID,并包含 CompositeValue
作为附加属性。 MyEntity
将包含 CompositeSampler
列表。
解决方案3
添加从 CompositeValue
到 ReferencedEntity
的引用。
顺便说一句,根据 JPA 2.1 规范:“如果将可嵌入类用作映射键,则可嵌入类必须实现与可嵌入类映射到的数据库列一致的 hashCode 和 equals 方法”。
关于java - hibernate/JPA : QueryException when hibernate generates metamodel for @ElementCollection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21952991/
我在执行此代码时遇到问题org.hibernate.QueryException:无法解析属性 def show = { def results = PM.createCriteria().l
我在尝试将条目插入包含地理位置数据的表时遇到问题。事实上,该表仅包含一个地理位置列,一种 Point 数据类型。我正在使用 Java JPA 和 MariaDB。最奇怪的部分是,代码曾经可以工作,但应
我正在使用 FluentNHibernate 和 Linq To Nhibernate,以及这些实体(仅相关部分): public class Player : BaseEntity { pr
我使用 NHiberNate 编写了联合查询,但收到 NHibernate.QueryException:not an Association: Id 这就是 NHibernate 库的样子 Tick
我有一个正在尝试执行的 HQL 查询,但我不断收到 QueryException。 我的查询是 SELECT a FROM (SELECT MAX(m.version) maxVersionOp, m
使用oracle DB,我们创建了一个没有PK的表(我们知道这不是一个好的做法,但我们仍然希望有人可以帮助我们),我们需要使用约束作为替代方案。我们能够将数据插入数据库,不幸的是我们无法检索,因为它会
我关闭了 EclipseLink 缓存,因为我正在外部修改数据,并且不希望遇到手动刷新所有内容的麻烦。显然,这是在 persistence.xml 中关闭缓存以避免对象身份问题的正确方法:
使用 JPA 2.0、Java EE 5、Weblogic 10.3 (11g)、JDK 6、EclipseLink。 当我尝试运行它时: CriteriaQuery _criteriaquery
我已经在本地主机中创建了数据库 Illuminate\Database\QueryException : SQLSTATE[HY000] [1045] Access denied for user
我想通过限制在 Hibernate 中的条件添加订单。 我有两个表 Event 和 MainEvent 与一对多的关系(一个 MainEvent 有很多事件)。 final Criteria
我正在尝试使用 Hibernate 连接到数据库。当前表格具有以下布局: (field1, field2, field3, optional1, optional2...) 其中 field1、fie
这是此错误的另一种情况: 21:22:15,881 ERROR [SessionFactoryImpl] Error in named query: ch.software.gvs.TroubleNo
这是我的查询 SQL_QUERY="SELECT review.comment FROM ReviewDO review WHERE title='"+titleName+"'"; 我试图通过使用标题
我有一个 org.hibernate.QueryException,我很难理解为什么。 hibernate 未解析的属性 langue_id 在我的实体 Conditionnement 中定义。 堆栈
我想在laravel中注册时遇到问题。完成注册表后,我看到此错误消息: QueryException in Connection.php line 770:SQLSTATE[HY000] [1045]
这是我尝试处理重复条目的模型代码: $userData = ['name' => $name, 'email' => $email, 'password' => $password]; publ
我在 Laravel 应用程序中工作,并通过 user_id 列将 users 表与 posts 表相关联。 posts 表中已有 user_id 列。但是当我运行 php artisan db:se
我正面临一种奇怪的问题,不知道该往哪个方向解决;-) 我目前正在开发一个 Web 应用程序,用于使用 Hibernate 存储员工。 插入、删除、搜索;一切正常。 但! 每个员工都有一个由字符串列表表
这是我第一次使用JPA。我用 Java 和 JPA 编写代码。我的代码如下。 String queryStr = "SELECT m.title, b.isbn, b.authors"; q
我正在尝试从当前用户获取特定租金的列表。 Controller 中的代码: def index() { if (isLoggedIn()) { String username = getPri
我是一名优秀的程序员,十分优秀!