Как автоматически вставить внешний ключ при вставке сущности / объекта с помощью Spring Boot JPA в MySQL - PullRequest
0 голосов
/ 21 января 2020

Я попытался вставить сущность, которая содержит внешний ключ, от Spring boot JPA до MYSQL. Но получите ошибку:

java.sql.SQLIntegrityConstraintViolationException: Column 'role_role_id' cannot be null.

Я знаю, что это ошибка, когда я вставляю ноль в столбец, который не допускает ноль. Я знаю, что исправление (см. MyMainController ниже) заключается в том, чтобы получить объект Role (foreignkey) для установки в мой объект User, а затем вставить пользовательский объект в DB (новая строка в DB) (необходимые данные Role уже находятся в базе данных). Но я хочу, чтобы, когда я вставлял пользователя, он автоматически вставлял объектную роль, потому что я четко определил область действия (более подробную информацию см. В моих рисунках в разделе «Объект пользователя» и «Объект роли»). Пожалуйста, смотрите мой код.

Это ERR:

java.sql.SQLIntegrityConstraintViolationException: Column 'role_role_id' cannot be null.

Это myMainRestController

@RestController
public class MyMainController {

@Autowired
private UserRepository service;

@RequestMapping("/i")
@ResponseBody
public String Welcome() {
    return "Welcome!";
}
@JsonIgnore
@RequestMapping(value = "/", //
        method = RequestMethod.GET, //
        produces = { MediaType.APPLICATION_JSON_VALUE })
@ResponseBody
public User initData() {




    User user = new User();
    user.setUserId(4);
    user.setPassword("1234");
    user.setFullname("Nguyễn Văn D");
    user.setPhonenumber("012345678");
    user.setAddress("2 đường Số 7 Bình Trị Dông");
    user.setFontIdCardImg("p2fontid.jpg");
    user.setBackIdCardImg("p2backid.jpg");
    user.setRoleId(2);
    user.setAreaId(2);

//      Role role = new Role();
//      role.setRoleId(user.getRoleId());   / My fix here
//      user.setRole(role);

    service.save(user);
    return user;
}

}

Это мой пользовательский объект:

@Entity
@Table(name="user")
@NamedQuery(name="User.findAll", query="SELECT u FROM User u")
public class User implements Serializable {
private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="user_id", unique=true, nullable=false)
private Integer userId;

@Column(length=1000)
private String address;

@Column(name="area_id")
private Integer areaId;

@Column(name="back_id_card_img", length=200)
private String backIdCardImg;

@Column(name="font_id_card_img", length=200)
private String fontIdCardImg;

@Column(length=45)
private String fullname;

@Column(length=45)
private String password;

@Column(length=45)
private String phonenumber;

@Column(name="role_id")
private Integer roleId;

//bi-directional many-to-one association to Accident
@OneToMany(mappedBy="user")
private List<Accident> accidents;

//bi-directional many-to-one association to Area
@ManyToOne
@JoinColumn(name="area_area_id")
private Area area;

//bi-directional many-to-one association to Policeworktime
@ManyToOne
@JoinColumn(name="policeworktime_police_user_id")
private Policeworktime policeworktime;

//bi-directional many-to-one association to Role
@ManyToOne(cascade={CascadeType.ALL})
@JoinColumn(name="role_role_id", nullable=false)
private Role role;

public User() {
}

public Integer getUserId() {
    return this.userId;
}

public void setUserId(Integer userId) {
    this.userId = userId;
}

public String getAddress() {
    return this.address;
}

public void setAddress(String address) {
    this.address = address;
}

public Integer getAreaId() {
    return this.areaId;
}

public void setAreaId(Integer areaId) {
    this.areaId = areaId;
}

public String getBackIdCardImg() {
    return this.backIdCardImg;
}

public void setBackIdCardImg(String backIdCardImg) {
    this.backIdCardImg = backIdCardImg;
}

public String getFontIdCardImg() {
    return this.fontIdCardImg;
}

public void setFontIdCardImg(String fontIdCardImg) {
    this.fontIdCardImg = fontIdCardImg;
}

public String getFullname() {
    return this.fullname;
}

public void setFullname(String fullname) {
    this.fullname = fullname;
}

public String getPassword() {
    return this.password;
}

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

public String getPhonenumber() {
    return this.phonenumber;
}

public void setPhonenumber(String phonenumber) {
    this.phonenumber = phonenumber;
}

public Integer getRoleId() {
    return this.roleId;
}

public void setRoleId(Integer roleId) {
    this.roleId = roleId;
}

public List<Accident> getAccidents() {
    return this.accidents;
}

public void setAccidents(List<Accident> accidents) {
    this.accidents = accidents;
}

public Accident addAccident(Accident accident) {
    getAccidents().add(accident);
    accident.setUser(this);

    return accident;
}

public Accident removeAccident(Accident accident) {
    getAccidents().remove(accident);
    accident.setUser(null);

    return accident;
}

public Area getArea() {
    return this.area;
}

public void setArea(Area area) {
    this.area = area;
}

public Policeworktime getPoliceworktime() {
    return this.policeworktime;
}

public void setPoliceworktime(Policeworktime policeworktime) {
    this.policeworktime = policeworktime;
}

public Role getRole() {
    return this.role;
}

public void setRole(Role role) {
    this.role = role;
}

}

Это моя роль:

@Entity
@Table(name="role")
@NamedQuery(name="Role.findAll", query="SELECT r FROM Role r")
public class Role implements Serializable {
private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="role_id", unique=true, nullable=false)
private Integer roleId;

@Column(name="role_name", length=45)
private String roleName;

//bi-directional many-to-one association to User
@OneToMany(mappedBy="role", cascade={CascadeType.ALL})
private List<User> users;

public Role() {
}

public Integer getRoleId() {
    return this.roleId;
}

public void setRoleId(Integer roleId) {
    this.roleId = roleId;
}

public String getRoleName() {
    return this.roleName;
}

public void setRoleName(String roleName) {
    this.roleName = roleName;
}

public List<User> getUsers() {
    return this.users;
}

public void setUsers(List<User> users) {
    this.users = users;
}

public User addUser(User user) {
    getUsers().add(user);
    user.setRole(this);

    return user;
}

public User removeUser(User user) {
    getUsers().remove(user);
    user.setRole(null);

        return user;
    }

}

1 Ответ

0 голосов
/ 18 февраля 2020

Вам не нужно создавать ролевой идентификатор Colunm. Вы просто ставите реляционные с таблицами. Например, в моей ситуации у меня есть пользователь OneToMany с ролью. Я установил реляционные только в моей MySql БД. И тогда вы можете создавать свои собственные объекты или использовать инструмент JPA в вашем распоряжении. У сущности пользователя есть объект Role, у сущности Role есть список. enter image description here

@Entity
@Table(name="role")
@NamedQuery(name="Role.findAll", query="SELECT r FROM Role r")
public class Role implements Serializable {
private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="role_id", unique=true, nullable=false)
private Integer roleId;

@Column(name="role_name", length=45)
private String roleName;

//bi-directional many-to-one association to User
@OneToMany(mappedBy="role")
private List<User> users;

public Role() {
}

public Integer getRoleId() {
    return this.roleId;
}

public void setRoleId(Integer roleId) {
    this.roleId = roleId;
}

public String getRoleName() {
    return this.roleName;
}

public void setRoleName(String roleName) {
    this.roleName = roleName;
}

public List<User> getUsers() {
    return this.users;
}

public void setUsers(List<User> users) {
    this.users = users;
}

public User addUser(User user) {
    getUsers().add(user);
    user.setRole(this);

    return user;
}

public User removeUser(User user) {
    getUsers().remove(user);
    user.setRole(null);

    return user;
}

 }


@Entity
@Table(name = "user")
@NamedQuery(name = "User.findAll", query = "SELECT u FROM User u")
public class User implements Serializable {
private static final long serialVersionUID = 1L;


// bi-directional many-to-one association to Role
@ManyToOne
@JoinColumn(name = "role_role_id", nullable = false)
private Role role;



public Role getRole() {
    return this.role;
}

public void setRole(Role role) {
    this.role = role;
}



}
...