当前位置: 首页 > 知识库问答 >
问题:

Spring JPA findByEmail无法与@manytomy column join一起使用

步博厚
2023-03-14

只要我向实体添加带有@JoinColumn的@manytone映射,并执行findBy派生的查询方法,我就会得到org。冬眠PropertyAccessException:无法设置字段值exception。

ERROR 90376 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.orm.jpa.JpaSystemException: Could not set field value [User(name=null, email=email@gmail.com, accountState=ACTIVE, profilePicture=null, otpJsonString=null, company=null)] value by reflection : [class com.example.entity.User.company] setter of com.example.entity.User.company; nested exception is org.hibernate.PropertyAccessException: Could not set field value [User(name=null, email=email@gmail.com, accountState=ACTIVE, profilePicture=null, otpJsonString=null, company=null)] value by reflection : [class com.example.entity.User.company] setter of com.example.entity.User.company] with root cause

java.lang.IllegalArgumentException: Can not set com.example.entity.Company field com.example.entity.User.company to com.example.entity.User
package com.example.entity;

import lombok.*;

import javax.persistence.*;

@Entity
@Getter
@Setter
@ToString
@AllArgsConstructor
@NoArgsConstructor
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public abstract class BaseEntity {

    @Id
    @GeneratedValue
    @Basic(optional = false)
    private Long id;
}

package com.example.entity;

import lombok.*;
import lombok.experimental.SuperBuilder;
import org.springframework.data.annotation.CreatedBy;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedBy;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import javax.persistence.EntityListeners;
import javax.persistence.MappedSuperclass;
import java.time.Instant;

@Getter
@Setter
@ToString
@MappedSuperclass
@NoArgsConstructor
@EntityListeners(AuditingEntityListener.class)
public abstract class Auditable<T> extends BaseEntity {

    @CreatedBy
    protected T createdBy;
    @CreatedDate
    protected Instant createdAt;
    @LastModifiedBy
    protected T lastModifiedBy;
    @LastModifiedDate
    protected Instant lastModifiedAt;

    public Auditable(Long id) {
        super(id);
    }
}

package com.example.entity;

import lombok.*;
import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;

import javax.persistence.*;
import java.io.Serializable;

@Getter
@Setter
@Entity
@ToString
@EqualsAndHashCode
@NoArgsConstructor
public class User extends Auditable<String> implements Serializable {

    @NonNull
    private String name;
    @NonNull
    private String email;
    @NonNull
    private String accountState; //ACTIVE, BLOCKED, DELETED
    private String profilePicture;
    private String otpJsonString;
    @ManyToOne(optional = false)
    @JoinColumn(name = "Company_Id", referencedColumnName = "Id")
    private Company company;

    public User(Long id, String name, String email, Company company,
                String profilePicture, String accountState, String otpJsonString) {
        super(id);
        this.name = name;
        this.email = email;
        this.accountState = accountState;
        this.company = company;
        this.profilePicture = profilePicture;
        this.otpJsonString = otpJsonString;
    }
}

package com.example.entity;

import lombok.*;

import javax.persistence.*;
import java.io.Serializable;
import java.util.Set;

@Getter
@Setter
@Entity
@ToString
@EqualsAndHashCode
@NoArgsConstructor
@Table(indexes = {
        @Index(name = "website_unq_idx", columnList = "website", unique = true),
        @Index(name = "emailDomain_unq_idx", columnList = "emailDomain", unique = true),
})
public class Company extends Auditable<String> implements Serializable {

    @NonNull
    private String name;
    @NonNull
    private String logo;
    @NonNull
    private String website;
    @NonNull
    private String accountState; //ACTIVE, BLOCKED, DELETED
    @NonNull
    private String emailDomain;

    public Company(Long id, String name, String logo, String website, String accountState,
                                    String emailDomain) {
        super(id);
        this.name = name;
        this.logo = logo;
        this.website = website;
        this.accountState = accountState;
        this.emailDomain = emailDomain;
    }
}

下面是被解雇的Spring查询:

Hibernate: 
    select
        user0_.id as id1_0_,
        user0_.created_at as created_1_4_,
        user0_.created_by as created_2_4_,
        user0_.last_modified_at as last_mod3_4_,
        user0_.last_modified_by as last_mod4_4_,
        user0_.account_state as account_5_4_,
        user0_.email as email6_4_,
        user0_.company_id as comp_ch10_4_,
        user0_.name as name7_4_,
        user0_.otp_json_string as otp_json8_4_,
        user0_.profile_picture as profile_9_4_ 
    from
        user user0_ 
    where
        user0_.email=? 
        and user0_.account_state<>?
package com.example.repository;

import com.example.entity.User;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Optional;

@Repository
public interface UserRepository extends JpaRepository<User, Long> {
   
    Optional<User> findByEmailAndAccountStateNot(String email, String accountState);
}

共有1个答案

南门飞
2023-03-14

文档中的可选代码

关联是否是可选的。如果设置为false,则非空关系必须始终存在。

所以对于optional=falseJPA希望数据库中始终提供该对象的数据。删除此项以不映射公司对象

 类似资料:
  • 问题内容: 我的程序应该等待按下向左或向右箭头键,然后更改一个值,以便下次更新PaintComponent时,屏幕看起来有所不同。但是,运行该程序时,屏幕没有变化。 以下是变量声明: 这是主要的KeyListener声明: 这是用于绘画的方法: 当我运行该程序时,该程序会打印外壳,但是当我按箭头键时,屏幕上没有任何变化。 问题答案: 您需要先将关键侦听器添加到组件,然后才能调用它: 您还需要使组件

  • 问题内容: click事件可以正常运行,但是onmouseover事件不起作用。 问题答案: 您需要大写一些字母。

  • 问题内容: 我需要为我的应用程序读/写锁。我已阅读 https://en.wikipedia.org/wiki/Readers%E2%80%93writer_lock 并写了我自己的类,因为在swift中没有读/写锁 效果很好,直到我尝试从GCD线程使用它。 当我尝试在某个时刻从不同的异步块使用此类时,它允许在写入被锁定时进行写入 这是示例日志: 因此,您可以看到g被锁定,但是objc_sync_

  • 问题内容: 我在用Java做一个小Gui。我正在使用setBounds方法在JFrame上设置按钮等的位置,但是问题是,当我将JPanel按钮与JFrame一起使用时,在JFrame上不可见,并且如果没有JPanel也可以,请同时阅读代码,并请帮帮我我是初学者,正面临这些愚蠢的问题。 这个很好 当我将按钮添加到Jpanel时,相同的代码不起作用,所以怎么了,请指导我 请帮我解决这个小问题 问题答案

  • 我目前正在将IntelliJ IDE用于复杂的GWT项目。我想在GWT的开发模式中利用JRebel,所以最近我为IntelliJ安装了JRebel插件,但在使其工作时遇到了麻烦。 基本上IntelliJ不具备在更改时自动编译应用程序的能力,所以每当您对代码进行更改时,我都必须进行编译- 信息:使用JavaC1.7.0_21编译java源代码信息:15个错误信息:0个警告信息:编译完成,9分钟5秒内

  • 问题内容: 我使用以下代码将数据发送到MailChimp新闻列表(API v3)。每次我从函数中删除时,它都会尝试通过GET发布数据,并正确发送数据(在MailChimp API仪表板中可以确定响应)。在浏览器(FF)中进行测试时,我得到一个响应为“ true”的.part文件。 我将我的头发拔了出来,任何见识都将受到赞赏。 提前致谢, JN 问题答案: 主要问题是jc在您的原始帖子中评论了什么-

  • 问题内容: http://jsfiddle.net/YcK5X/ 我想知道为什么这个AJAX请求没有返回任何内容。 问题答案: 您想要echo:ed的数据必须在名为html的POST参数中提供:

  • 问题内容: 使用React Router v4开发React应用程序。一切顺利,直到我在应用程序中引入了Redux。从那时起,单击更改路径的链接时,浏览器url发生更改,但是未加载与该路径相对应的组件。如果我注释掉Redux代码,它会很好地工作。是什么原因造成的?这是我的路由代码: PS:控制台没有错误。代码运行干净,只是组件没有加载。这是github上的类似线程:4671。我在各种站点上看到了很