2

Hi I am trying to do one to many insert but I am having problems. I have two tables:

CREATE TABLE users_app (
user_id int UNSIGNED NOT NULL AUTO_INCREMENT,
user_number varchar(45) NOT NULL default '0',
user_password varchar(45) NOT NULL default '0',
os int(1) unsigned NOT NULL,
token varchar(500) NOT NULL,
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8;

CREATE TABLE user_app_devices(  
 id int AUTO_INCREMENT PRIMARY KEY,  
 user_id int UNSIGNED  NULL,  // Here it can accept null values
 device_name varchar(45) NOT NULL,
 FOREIGN KEY (user_id) REFERENCES users_app (user_id)  
)ENGINE=InnoDB CHARSET=utf8;

My classes:

@Entity
@Table(name="user_app_devices")
public class UserAppDevice implements Serializable {
private static final long serialVersionUID = 1L;

@Id
@Column(name="id")
@GeneratedValue(strategy = IDENTITY)
private int id;


@Column(name="device_name")
private String deviceName;

//bi-directional many-to-one association to UsersApp
@ManyToOne
@JoinColumn(name="user_id",insertable=false,updatable=false)  // Ignoring this column    using JSON IGNORE
@JsonIgnore     
private UsersApp usersApp;


@Column(name="user_id")
private int userId;

public UserAppDevice() {
}

public int getId() {
 return this.id;
}

public void setId(int id) {
  this.id = id;
}

public int getUserId() {
 return this.id;
}

public void setUserId(int id) {
  this.id = id;
}

public String getDeviceName() {
 return this.deviceName;
}

public void setDeviceName(String deviceName) {
 this.deviceName = deviceName;
}

public UsersApp getUsersApp() {
 return this.usersApp;
}

public void setUsersApp(UsersApp usersApp) {
 this.usersApp = usersApp;
}

}

@Entity
@Table(name="users_app")
public class UsersApp implements Serializable {
 private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name="user_id")
private int userId;

private int os;

private String token;

 @Column(name="user_number")
 private String userNumber;

 @Column(name="user_password")
 private String userPassword;

 //bi-directional many-to-one association to UserAppDevice
 @OneToMany(mappedBy="usersApp")
 private List<UserAppDevice> userAppDevices;

 public UsersApp() {
 }

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

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

 public int getOs() {
  return this.os;
 }

 public void setOs(int os) {
  this.os = os;
 }

 public String getToken() {
  return this.token;
 }

 public void setToken(String token) {
  this.token = token;
 }

 public String getUserNumber() {
   return this.userNumber;
 }

 public void setUserNumber(String userNumber) {
   this.userNumber = userNumber;
 }

 public String getUserPassword() {
   return this.userPassword;
  }

 public void setUserPassword(String userPassword) {
    this.userPassword = userPassword;
 }

 public List<UserAppDevice> getUserAppDevices() {
    return this.userAppDevices;
 }

 public void setUserAppDevices(List<UserAppDevice> userAppDevices) {
   this.userAppDevices = userAppDevices;
 }

 public UsersApp(int os, String token, String userNumber, String userPassword) {
   this.os = os;
   this.token = token;
   this.userNumber = userNumber;
   this.userPassword = userPassword;
 }

In 'user_app_devices' Table 'user_id' Column accepting Null value in MySql. But using Hibernate it's not accepting value ,giving the following errror Message is :

[WARN] org.hibernate.engine.jdbc.spi.SqlExceptionHelper - SQL Error: 1452, SQLState: 23000
[ERROR] org.hibernate.engine.jdbc.spi.SqlExceptionHelper - Cannot add or update a child row: a foreign key constraint fails (`user_app_devices`, CONSTRAINT `user_id` FOREIGN KEY (`user_id`) REFERENCES `user_app` (`user_id`))
[ERROR] com.jaguar.nbfcapp.aop.logging.LoggingAspect - Exception in com.example.web.rest.userResource.create() with cause = org.hibernate.exception.ConstraintViolationException: could not execute statement
org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute
user3796703
  • 189
  • 1
  • 2
  • 7

2 Answers2

1

That's because you're inserting a device with a user_id that doesn't exist in the users_app table. BTW, you shouldn't have this user_id field in the Device entity, since you have a ManyToOne association. Just use

@ManyToOne
@JoinColumn(name="user_id")
@JsonIgnore     
private UsersApp usersApp;
JB Nizet
  • 678,734
  • 91
  • 1,224
  • 1,255
  • I have a similar problem. are you willing to help me with it? here is the link: http://stackoverflow.com/questions/25454703/constraint-violation-when-persisting-one-to-many-relation – CodeMed Aug 22 '14 at 22:52
0

Just try with

@JoinColumn(name="user_id", nullable = true)

For insertable and updatable attribute explanation, see this SO

Community
  • 1
  • 1
Wundwin Born
  • 3,467
  • 19
  • 37