所以我有这个kotlin项目:
package com.example.demo
import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.data.repository.CrudRepository
import java.util.*
import javax.persistence.*
@MappedSuperclass
abstract class ContainerEntity<TData : DataEntity> {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
var id: Int = 0
@OneToOne(fetch = FetchType.EAGER, cascade = [CascadeType.ALL], optional = false)
lateinit var data: TData
}
@MappedSuperclass
abstract class DataEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
var id: Int = 0
val created = Date()
}
@Entity
class Car : ContainerEntity<CarData>()
@Entity
class CarData : DataEntity() {
var color = "red"
}
@Entity
class Apple : ContainerEntity<AppleData>()
@Entity
class AppleData : DataEntity() {
var age = 32
}
/**
* WORKS
*/
interface CarRepository : CrudRepository<Car, Int> {
fun findByDataColor(color: String): Car?
}
/**
* FAILS
*/
interface AppleRepository : CrudRepository<Apple, Int> {
fun findByDataAge(age: Int): Apple?
}
获取此异常:
Caused by: java.lang.IllegalArgumentException: Unable to locate Attribute with the the given name [age] on this ManagedType [com.example.demo.DataEntity]
at org.hibernate.metamodel.internal.AbstractManagedType.checkNotNull(AbstractManagedType.java:128) ~[hibernate-core-5.3.10.Final.jar:5.3.10.Final]
at org.hibernate.metamodel.internal.AbstractManagedType.getAttribute(AbstractManagedType.java:113) ~[hibernate-core-5.3.10.Final.jar:5.3.10.Final]
at org.hibernate.metamodel.internal.AbstractManagedType.getAttribute(AbstractManagedType.java:111) ~[hibernate-core-5.3.10.Final.jar:5.3.10.Final]
at org.hibernate.query.criteria.internal.path.SingularAttributePath.locateAttributeInternal(SingularAttributePath.java:71) ~[hibernate-core-5.3.10.Final.jar:5.3.10.Final]
at org.hibernate.query.criteria.internal.path.AbstractPathImpl.locateAttribute(AbstractPathImpl.java:204) ~[hibernate-core-5.3.10.Final.jar:5.3.10.Final]
at org.hibernate.query.criteria.internal.path.AbstractPathImpl.get(AbstractPathImpl.java:177) ~[hibernate-core-5.3.10.Final.jar:5.3.10.Final]
at org.springframework.data.jpa.repository.query.QueryUtils.toExpressionRecursively(QueryUtils.java:673) ~[spring-data-jpa-2.1.8.RELEASE.jar:2.1.8.RELEASE]
at org.springframework.data.jpa.repository.query.QueryUtils.toExpressionRecursively(QueryUtils.java:606) ~[spring-data-jpa-2.1.8.RELEASE.jar:2.1.8.RELEASE]
at org.springframework.data.jpa.repository.query.QueryUtils.toExpressionRecursively(QueryUtils.java:578) ~[spring-data-jpa-2.1.8.RELEASE.jar:2.1.8.RELEASE]
at org.springframework.data.jpa.repository.query.JpaQueryCreator$PredicateBuilder.getTypedPath(JpaQueryCreator.java:381) ~[spring-data-jpa-2.1.8.RELEASE.jar:2.1.8.RELEASE]
at org.springframework.data.jpa.repository.query.JpaQueryCreator$PredicateBuilder.build(JpaQueryCreator.java:304) ~[spring-data-jpa-2.1.8.RELEASE.jar:2.1.8.RELEASE]
at org.springframework.data.jpa.repository.query.JpaQueryCreator.toPredicate(JpaQueryCreator.java:209) ~[spring-data-jpa-2.1.8.RELEASE.jar:2.1.8.RELEASE]
at org.springframework.data.jpa.repository.query.JpaQueryCreator.create(JpaQueryCreator.java:122) ~[spring-data-jpa-2.1.8.RELEASE.jar:2.1.8.RELEASE]
at org.springframework.data.jpa.repository.query.JpaQueryCreator.create(JpaQueryCreator.java:57) ~[spring-data-jpa-2.1.8.RELEASE.jar:2.1.8.RELEASE]
at org.springframework.data.repository.query.parser.AbstractQueryCreator.createCriteria(AbstractQueryCreator.java:119) ~[spring-data-commons-2.1.8.RELEASE.jar:2.1.8.RELEASE]
at org.springframework.data.repository.query.parser.AbstractQueryCreator.createQuery(AbstractQueryCreator.java:95) ~[spring-data-commons-2.1.8.RELEASE.jar:2.1.8.RELEASE]
at org.springframework.data.repository.query.parser.AbstractQueryCreator.createQuery(AbstractQueryCreator.java:81) ~[spring-data-commons-2.1.8.RELEASE.jar:2.1.8.RELEASE]
at org.springframework.data.jpa.repository.query.PartTreeJpaQuery$QueryPreparer.<init>(PartTreeJpaQuery.java:147) ~[spring-data-jpa-2.1.8.RELEASE.jar:2.1.8.RELEASE]
at org.springframework.data.jpa.repository.query.PartTreeJpaQuery$CountQueryPreparer.<init>(PartTreeJpaQuery.java:270) ~[spring-data-jpa-2.1.8.RELEASE.jar:2.1.8.RELEASE]
at org.springframework.data.jpa.repository.query.PartTreeJpaQuery.<init>(PartTreeJpaQuery.java:79) ~[spring-data-jpa-2.1.8.RELEASE.jar:2.1.8.RELEASE]
... 98 common frames omitted
有一个小型演示项目:https://github.com/TomGrill/spring-hibernate-bug
应要求:
//@MappedSuperclass
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
abstract class ContainerEntity<TData : DataEntity> {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
var id: Int = 0
@OneToOne(fetch = FetchType.EAGER, cascade = [CascadeType.ALL], optional = false)
lateinit var data: TData
}
//@MappedSuperclass
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
abstract class DataEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
var id: Int = 0
val created = Date()
}
您正在将@MappedSuperclass
与DataEntity
一起使用,但您应该使用@heritation
。
@MappedSuperclas
s是一个注释,它告诉JPA所有子类都必须具有继承的属性,但与JPA继承无关。
要在JPA中使用继承,您必须使用@heritation
。
有三种策略定义如何将信息树存储到数据库:SINGLE_TABLE、JOINED和TABLE_PER_CLASS。
我有这个实体,它的ID定义在可识别类。 InventoryLoad的主键为InventoryLoadID 这是上述类的ID 我正在使用Criteria builder访问ID类的列。 要使用 Path 来获取此信息以获取 PK 的库存 ID 的路径。 获取此错误
冬眠5.2.12.1决赛 我想用CriteriaBuilder替换depreracted session.createCriteria(参见org.hibernate.Criteria),我有以下异常 在此ManagedType[com…DonneReference]上找不到具有给定名称[filtre]的属性 上: 其中(builder.equal(root.get(“filter”),filte
我有一个实体叫做 我正在尝试使用criteriaBuilder和谓词进行搜索 我在这里得到了例外 我曾提出一些类似的问题,但我没有得到任何解决办法。
我试图提供应用程序在Spring与懒惰取实体之间的关系。 模型"用户": “跟踪器”模型 继承了带有@EntityGraph的JPA存储库。通过这一点,我试图为select用户提供与以下相关的所有跟踪器: 存储库类: 和控制器: 查询“/customers/1”可以正常工作。它返回没有跟踪器的所有客户(相应地,延迟获取)。 但是"/顾客/1/with Tracker"返回以下异常:
我的服务类 和我的控制器类:
我正在用JPA和Spring数据映射Hibernate中的实体,当我运行应用程序时,我得到 我有一个超类baseEntity: Spring Boot 2.1.9.发布 Java 11 Hibernate Core 5.3.12.final JPA 2.2