【问题标题】:Data is being sent to database as null after sending from frontend从前端发送后,数据被发送到数据库为空
【发布时间】:2021-12-18 21:21:19
【问题描述】:

我正在尝试在 EventUser 实体之间建立连接,以便我可以将参与者保存到事件中。我以前从未使用过@ManyToMany 映射,因此一直在学习教程。当我尝试通过邮递员(eventiduserid)发布数据时,我得到的都是空值。

到目前为止,我有用户和事件实体,

@Data
//Entity maps object to database
@Entity
@NoArgsConstructor
@Table(name = "member")
public class User implements UserDetails, Serializable {

//More fields

//Relationship between user and events to get entrants
    @OneToMany(mappedBy = "userid", fetch = FetchType.LAZY)
    Set<Entrants> entrants;
@Data
//Entity maps object to database
@Entity
@NoArgsConstructor
@Table(name = "event")
public class Event implements Serializable {

//More fields

//Relationship with event and users for entrants to an event
    @OneToMany(mappedBy = "eventid",fetch = FetchType.LAZY)
    Set<Entrants> entrants;

然后我有一个参赛者实体来举办活动的参赛者。

@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Entrants implements Serializable {

    @Id
    @GeneratedValue
    Long id;

    @ManyToOne
    @JoinColumn(name = "user_id")
    User userid;

    @ManyToOne
    @JoinColumn(name = "event_id")
    Event eventid;


}

然后在我的控制器中,

@PostMapping("/management/events/entrants")
    GenericResponse createEntrant(@Valid @RequestBody Entrants entrant) {
        System.out.println("entrant is: " +entrant);
        entrantService.save(entrant);
        return new GenericResponse("Entrant saved");
    }

EntrantService

public Entrants save(Entrants entrants) {
        return entrantRepository.save(entrants);
    }

存储库是标准的,上面使用了save()方法。

如果我在 Postman 中发布以下内容,

{
    "user_id": 1,
    "event_id": 1
}

我明白了 entrant is: Entrants(id=null, userid=null, eventid=null) id 显然是 Spring 创建的,但 userideventid 为空。

根据我有限的知识,我认为这与Entrants 实体中的两个字段有关,类型为UserEvent,而不是int。但我不确定如何解决这个问题。

我遵循的教程并不是真正基于我的实现,所以我不得不进行很多更改。

【问题讨论】:

    标签: spring jpa hibernate-mapping


    【解决方案1】:

    您可以像这样在控制器中使用 Dto:

    @PostMapping("/management/events/entrants")
       createEntrant(@Valid @RequestBody EntrantDto entrant) {
            System.out.println("entrant is: " +entrant);
            entrantService.save(entrant);
            return new GenericResponse("Entrant saved");
        }
    

    EntrantDto.java

    public class EntrantDto {
        private Long user_id;
        private Long event_id;
        // no-args constructor, getter, setter,...
    }
    

    并修改您的服务,例如

    public Entrants save(EntrantDto entrant) {
        User user = this.userRepository.findById(entrant.getUser_id()).orElseThrown(IllegalArgumentException::new);
        Event event = this.eventRepository.findById(entrant.getEvent_id()).orElseThrown(IllegalArgumentException::new);
        Entrants entrants = new Entrants(user, event);
        return entrantRepository.save(entrants);
    }
    

    【讨论】:

    • 谢谢,我已经尝试过了,但是当我尝试使用this.eventRepository.findById(entrant.getEvent_id()).orElseThrown(IllegalArgumentException::new);创建事件时出现堆栈溢出错误
    • 是的,绝对是,因为您的@Data 包含HashCode 方法。因此,您应该使用 3 个 @Getter @Setter @NoArgsConstructor 注释而不是仅 1 个 @Data 注释。
    • 谢谢,我确实找到了解决此问题的方法,而是将 @ToString.Exclude 注释添加到事件实体中的课程和事件。这已经奏效了。尽管我仍然没有将 userid 和 eventid 传递给数据库。但我还没有机会研究这个呢
    • 我认为问题在于,它正在保存一个Entrant,其中包含用户和事件的所有详细信息。我只想保存userideventid
    • 还没保存?保存后,你收到了什么?具有 (id=x, user_id=null, event_id=null) 的参赛者行?
    猜你喜欢
    • 1970-01-01
    • 2022-01-28
    • 1970-01-01
    • 1970-01-01
    • 2021-04-28
    • 1970-01-01
    • 1970-01-01
    • 2021-11-03
    • 2023-03-30
    相关资源
    最近更新 更多