Home > Mobile >  Spring Boot: "Column 'username' cannot be null" on @manytoone join column
Spring Boot: "Column 'username' cannot be null" on @manytoone join column

Time:04-09

I'm trying to post the following json file into mysql database in postman.

{
    "rem_month": 3,
    "rem_day":  23,
    "description": "Happy birthday!",
    "username": "mortykrox93"
}

But i keep getting the error "Column 'username' cannot be null"

The app is supposed to allow me to login and add multiple reminders for each user.

Here is the sql files the entities are supposed to model:

user.sql

USE `login-reminder`;

CREATE TABLE `user` (
`email_id` varchar(30) DEFAULT NULL,
`password` varchar(30) DEFAULT NULL,
`username` varchar(30) NOT NULL,
PRIMARY KEY(`username`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

reminder.sql


USE `login-reminder`;

CREATE TABLE `reminder` (
`rem_num` int(12) NOT NULL,
`rem_month` int(2) DEFAULT NULL,
`rem_day` int(2) DEFAULT NULL,
`description` varchar(255) DEFAULT NULL,
`username` varchar(30) NOT NULL,
PRIMARY KEY(`rem_num`),
FOREIGN KEY(`username`) REFERENCES user(`username`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;

Here are the two entity files:

User.java

@Entity
@Table(name="user")
public class User {

    @Column(name="email_id")
    private String emailId;

    @Column(name="password")
    private String password;

    @Id
    @Column(name="username")
    private String username;

    @OneToMany(mappedBy="theUser", cascade = CascadeType.ALL)
    private List<Reminder> reminders;

    public User() {

    }

    public User(String emailId, String password, String username) {
        this.emailId = emailId;
        this.password = password;
        this.username = username;
    }

    public String getEmailId() {
        return emailId;
    }

    public void setEmailId(String emailId) {
        this.emailId = emailId;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }
}

Reminder.java


@Entity
@Table(name="reminder")
public class Reminder {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="rem_num")
    private int remNum;

    @Column(name="rem_month")
    private int remMonth;

    @Column(name="rem_day")
    private int remDay;

    @Column(name="description")
    private String description;

    @ManyToOne
    @JoinColumn(name="username")
    private User theUser;

    public Reminder() {

    }

    public Reminder(int remNum, int remMonth, int remDay, String description) {
        this.remMonth = remMonth;
        this.remDay = remDay;
        this.description = description;
    }

    public int getRemNum() {
        return remNum;
    }

    public void setRemNum(int remNum) {
        this.remNum = remNum;
    }

    public int getRemMonth() {
        return remMonth;
    }

    public void setRemMonth(int remMonth) {
        this.remMonth = remMonth;
    }

    public int getRemDay() {
        return remDay;
    }

    public void setRemDay(int remDay) {
        this.remDay = remDay;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }
}

Here is the restcontroller.

ReminderController.java

@RestController
public class ReminderController {

    @Autowired
    private ReminderRepository reminderRepository;

    @GetMapping("/reminders")
    public List<Reminder> getAllReminders() {
        return reminderRepository.findAll();
    }

    @PostMapping("/reminders")
    @CrossOrigin(origins = "http://localhost:4200")
    public Reminder createReminder(@RequestBody Reminder reminder) {
        return reminderRepository.save(reminder);
    }
}

If anyone can help I would appreciate it. Not sure if my entities are matching up with my sql statements, any suggestions would help.

CodePudding user response:

Check your reminder sql, it's username field is set as not null. The binding is with the User object. So, in your json, it you should send the user like this:

{
    "rem_month": 3,
    "rem_day":  23,
    "description": "Happy birthday!",
    "theUser":{
               "username":"mortykrox93",
               //and other fields if necessary
              } 
}

CodePudding user response:

This is occurring because of there is no field named username present in Reminder entity class and you are referring to same class in controller with annotation @requestbody to be bind with the request. Actually during deserialization no valid mapping is present for json field named username. so by default username is being set as null because of its datatype string.

Note: It's better to use separate model/pojo class for binding the request. And then map it to proper entity objects.

  • Related