@ManyToOne似乎没有像我预期的那样工作

时间:2015-12-01 09:10:00

标签: jpa

我正在处理我的两个表(员工和部门)之间的多对一关系,其中任何员工都可以在多个部门工作。我在Employee实体类中创建的Department对象字段中使用了@ManyToOne注释。现在,当我将Employee实体与特定部门持久化时,它工作正常,但是当我尝试持有另一个具有相同部门的Employee实体时,它会创建一个具有相同名称的新Department实体,并使用不同的id持久保存它。我期望它做的是当我持有一个已经持久化部门的Employee实体时,它应该只更新Employee实体的foriegn键以指向该部门的id。对不起,如果我完全没有多对一的概念。

EMPLOYEE entity
package com.test.domain;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.TableGenerator;

@Entity
public class Employee {

@TableGenerator(name="Empl_Gen", table="ID_GEN",pkColumnName="GEN_NAME",valueColumnName="GEN_VALUE", initialValue=0, allocationSize=1)
@Id@GeneratedValue(generator="Empl_Gen",strategy=GenerationType.TABLE)
private Long id;

private String Name;

private String Country;

@ManyToOne(cascade=CascadeType.ALL)
@JoinColumn(name="DEPT_ID")
private Department department;

public Department getDepartment() {
    return department;
}

public void setDepartment(Department department) {
    this.department = department;
}

public Long getId() {
    return id;
}

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

public String getName() {
    return Name;
}

public void setName(String name) {
    Name = name;
}

public String getCountry() {
    return Country;
}

public void setCountry(String country) {
    Country = country;
}

}


DEPARTMENT entity
package com.test.domain;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.TableGenerator;

@Entity
public class Department {


@TableGenerator(name="DEP_GEN",table="ID_GEN",pkColumnName="GEN_NAME",valueColumnName="GEN_VALUE", pkColumnValue="DEP_GEN",initialValue=0,allocationSize=1)
@Id@GeneratedValue(strategy=GenerationType.TABLE,generator="DEP_GEN")
private Long id;

private String name;

public Long getId() {
    return id;
}

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

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

}



package com.test.controllers;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.test.domain.Employee;
import com.test.service.EmployeeService;

/**
* Handles requests for the application home page.
*/
@Controller
@RequestMapping("/addEmployee")
public class HomeController {

@Autowired
EmployeeService service;

@RequestMapping(method=RequestMethod.GET)
public String getform(Model model)
{
    model.addAttribute("employee",new Employee());

  return "home";

}

@RequestMapping(method=RequestMethod.POST)
public String setform(Employee employee)
{


    service.save(employee);
    return"success";
}

}

package com.test.dao;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import com.test.domain.Employee;

@Repository
@Transactional
public class Employeedaoimpl implements Employeedao 

{
@PersistenceContext
EntityManager manager;

@Override
public void save(Employee employee) {
    manager.persist(employee);


}

}

1 个答案:

答案 0 :(得分:0)

试试这个:

@TableGenerator(name="DEP_GEN",table="ID_GEN",pkColumnName="GEN_NAME",valueColumnName="GEN_VALUE", pkColumnValue="DEP_GEN",initialValue=0,allocationSize=1) @Id@GeneratedValue(strategy=GenerationType.TABLE,generator="DEP_GEN") @Column(name = "DEPT_ID") private Long id;