i am following the example at
http://struts.apache.org/2.1.8.1/docs/struts-2-spring-2-jpa-ajax.html.
in this example, a very simple persistence is given (of which i am
thankful). but, what i am trying to do is slightly more complicated
with persistence. i need to persist a one-to-many relationship. when i
attempt to do so, i keep getting the following error.
Caused by: java.sql.BatchUpdateException: Cannot add or update a child
row: a foreign key constraint fails (`demo`.`employee`, CONSTRAINT
`employee_ibfk_1` FOREIGN KEY (`companyId`) REFERENCES `company`
(`id`))
what am i doing wrong?
i am using mysql, and these are my DDLs.
create table company (
name varchar(100) unique,
id mediumint not null auto_increment,
primary key(id),
index using btree(id)
);
create table employee(
companyId mediumint,
firstName varchar(100),
lastName varchar(100),
id mediumint not null auto_increment,
primary key(id),
index using btree(id),
foreign key (companyId) references company(id)
);
these are my classes for Company and Employee.
@Entity
@Table(name="company")
public class Company {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
private String name;
@OneToMany(mappedBy="companyId",
cascade={CascadeType.REMOVE, CascadeType.PERSIST},
targetEntity=Employee.class,
fetch=FetchType.EAGER)
@JoinColumn(name="companyId")
@ForeignKey(name="id",inverseName="companyId")
private List<Employee> employees;
public Company() { }
public Company(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void addEmployee(Employee employee) {
List<Employee> employees = getEmployees();
employees.add(employee);
employee.setCompanyId(getId());
}
public List<Employee> getEmployees() {
if(null == employees) {
employees = new ArrayList<Employee>();
}
return employees;
}
public void setEmployees(List<Employee> employees) {
this.employees = employees;
}
}
@Entity
@Table(name="employee")
public class Employee {
private int companyId;
@Id
private int id;
private String firstName;
private String lastName;
public Employee() { }
public Employee(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public int getCompanyId() {
return companyId;
}
public void setCompanyId(int companyId) {
this.companyId = companyId;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
my service implementation that keeps failing to persist is as follows.
any help would be greatly appreciated.
@Transactional
public class CompanyDao {
@PersistenceContext
protected EntityManager entityManager;
public CompanyDao() { }
public CompanyDao(EntityManager entityManager) {
this.entityManager = entityManager;
}
public void create(Company company) {
EntityManager em = getEntityManager();
em.persist(company);
}
public Company read(int id) {
EntityManager em = getEntityManager();
Company company = em.find(Company.class, id);
return company;
}
public void update(Company company) {
EntityManager em = getEntityManager();
em.merge(company);
}
public void delete(int id) {
Company company = read(id);
if(null != company) {
EntityManager em = getEntityManager();
em.remove(company);
}
}
public EntityManager getEntityManager() {
return entityManager;
}
public void setEntityManager(EntityManager entityManager) {
this.entityManager = entityManager;
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]