Spring Data JPA:@Entity属性未找到异常

11

我是spring-data-jpa的新手,目前正在尝试使用hibernate进行实现。我已经按照教程进行操作,但在启动应用程序时遇到了问题。我在启动过程中收到以下异常:

 Caused by: org.springframework.data.mapping.PropertyReferenceException: No property customer found for type com.adaptris.dashboard.customer.Customer
at org.springframework.data.mapping.PropertyPath.<init>(PropertyPath.java:74)
at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:326)
at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:352)
at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:306)
at org.springframework.data.mapping.PropertyPath.from(PropertyPath.java:270)
at org.springframework.data.mapping.PropertyPath.from(PropertyPath.java:244)
at org.springframework.data.repository.query.parser.Part.<init>(Part.java:73)
at org.springframework.data.repository.query.parser.PartTree$OrPart.<init>(PartTree.java:180)
at org.springframework.data.repository.query.parser.PartTree$Predicate.buildTree(PartTree.java:260)
at org.springframework.data.repository.query.parser.PartTree$Predicate.<init>(PartTree.java:240)
at org.springframework.data.repository.query.parser.PartTree.<init>(PartTree.java:71)
at org.springframework.data.jpa.repository.query.PartTreeJpaQuery.<init>(PartTreeJpaQuery.java:57)
at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$CreateQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:90)
at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$CreateIfNotFoundQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:162)
at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$AbstractQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:68)
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.<init>(RepositoryFactorySupport.java:280)
at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:148)
at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.getObject(RepositoryFactoryBeanSupport.java:125)
at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.getObject(RepositoryFactoryBeanSupport.java:41)
at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:142)

客户是我的领域类,带有注释

@Entity(name = "customer")

我猜它正在尝试连接数据库并获取客户表,而我实际上已经进行了配置。这是我的spring-config:

<tx:annotation-driven transaction-manager="transactionManager" />
<!-- Activate Spring Data JPA repository support -->
<jpa:repositories base-package="com.adaptris.dashboard.customer" />

    <!-- Declare a datasource that has pooling capabilities -->
<bean id="jpaDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
    destroy-method="close" p:driverClass="${app.jdbc.driverClassName}"
    p:jdbcUrl="${app.jdbc.url}" p:user="${app.jdbc.username}" p:password="${app.jdbc.password}"
    p:acquireIncrement="5" p:idleConnectionTestPeriod="60" p:maxPoolSize="100"
    p:maxStatements="50" p:minPoolSize="10" />

<!-- Declare a JPA entityManagerFactory -->
<bean id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
    p:persistenceXmlLocation="classpath*:META-INF/persistence.xml"
    p:persistenceUnitName="hibernatePersistenceUnit" p:dataSource-ref="jpaDataSource"
    p:jpaVendorAdapter-ref="hibernateVendor" />

<!-- Specify our ORM vendor -->
<bean id="hibernateVendor"
    class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"
    p:showSql="false" />

<!-- Declare a transaction manager -->
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"
    p:entityManagerFactory-ref="entityManagerFactory" />

数据库是正在运行的MYSQL。以下是属性:

# database properties
app.jdbc.driverClassName=com.mysql.jdbc.Driver
app.jdbc.url=jdbc\:mysql\://Mallik-PC/adaptrisschema
app.jdbc.username=dbuser
app.jdbc.password=dbpassword

请帮助我解决这个问题!!

3个回答

40

看起来你指定的 Domain 类的 Repository 接口包含一个 findXXX 方法,而 XXX 不是该 Domain 类的属性。

例如:

public interface UserRepository extends CrudRepository<User, String> {

    /**
     * Finds a user by name.
     * 
     * @param name The name of the User to find.
     * @return The User with the given name.
     */
    public User findByName(String name);
}

你的Domain类应该像这样,缺少"name"属性:

@Entity
public class User {
    private String firstname;
    private String lastname;
    // No "private String name" in here!
    ... 
}

在你的特定示例中,看起来你添加了一个findByCustomer(Customer customer)方法到你的Repository接口(可能被称为CustomerRepository之类的)。你不需要那个方法,因为Spring Data for JPA会自动生成一个findOne(<PrimaryKeyClass> id)方法,你可以将Customer域类的@Id作为参数调用它。


谢谢您的回复!经过一天的努力,我已经找到并从我的代码库中删除了那个方法。不过,使用findOne(<PrimaryKeyClass> id) 的想法听起来不错,我会尝试一下的!! - user1798932
它也解决了我的问题,但是什么情况?为什么它要从方法的名称映射查询结果?它应该从从数据库获取的参数中完成映射,你能否进一步阐述一下? - azerafati
这个工作原理是始终将属性的getter/setter方法的名称与数据库列进行匹配。您可以通过为属性指定不同的名称并使用@Column("MyColumnName")注释手动执行映射来修改此内容。 如果您没有执行任何操作(既不进行名称匹配也不使用@Column),则框架不知道如何将查询结果映射到您的对象。 - Rias A. Sherzad
非常感谢,我已经为此苦苦挣扎了一整天,但就是无法理解我的问题出在哪里。 - MrByte

1
在我的情况下,我因为Spring的大小写敏感性而遇到了这个错误。我通过使用领域类中声明为firstName的属性来搜索firstname。
@Entity
public class User {
    private String firstName;
...

因为find方法被声明为findByFirstname,所以我收到了这个错误。将字母n更改为N后,它可以正常工作。
public Collection<User> findByFirstName(@Param("firstName") String firstname);

1

Spring ORM的LocalContainerEntityManagerFactoryBean(我认为从3.1开始)有一个名为“packagesToScan”的属性。除非您有其他供应商属性要通过persistence.xml设置,否则请删除p:persistenceXmlLocation并替换为

p:packagesToScan="[package name where your entities are]"

这段代码告诉LocalContainerEntityManagerFactoryBean在哪里找到所有的@Entity实体类,并将它们包含在你的EntityManagerFactory中,以便Spring Data JPA可以找到如何处理“customer”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接