Не получается ожидаемый результат в случае много-много картографирования - PullRequest
0 голосов
/ 22 января 2019

Я новичок в спящем режиме.Я пытаюсь получить результат в сопоставлении «многие ко многим», но не получаю ожидаемого результата.

У меня есть две сущности 1. Emp 2. Dept. Обе они сопоставлены с БД со многими отношениями ко многим.

Emp.java

@Entity
public class Emp {

    @Id 
    int empId;
    String empName;
    @ManyToMany(mappedBy="emps")
    List<Dept> depts;

    public Emp() {
        // TODO Auto-generated constructor stub
    }

    /**
     * @param empId
     * @param empName
     * @param depts
     */
    public Emp(int empId, String empName) {
        super();
        this.empId = empId;
        this.empName = empName;
    }
    public int getEmpId() {
        return empId;
    }
    public void setEmpId(int empId) {
        this.empId = empId;
    }
    public String getEmpName() {
        return empName;
    }
    public void setEmpName(String empName) {
        this.empName = empName;
    }
    public List<Dept> getDepts() {
        return depts;
    }
    public void setDepts(List<Dept> depts) {
        this.depts = depts;
    }

    @Override
    public String toString() {
        return "Emp [empId=" + empId + ", empName=" + empName + ", depts=" + depts + "]";
    }

}


Dept.java
@Entity
public class Dept {

    @Id 
    int deptId;
    String deptName;
    @ManyToMany()
    List<Emp> emps;

    public Dept() {
        // TODO Auto-generated constructor stub
    }

    /**
     * @param deptId
     * @param deptName
     * @param emps
     */
    public Dept(int deptId, String deptName) {
        super();
        this.deptId = deptId;
        this.deptName = deptName;
    }



    public int getDeptId() {
        return deptId;
    }
    public void setDeptId(int deptId) {
        this.deptId = deptId;
    }
    public String getDeptName() {
        return deptName;
    }
    public void setDeptName(String deptName) {
        this.deptName = deptName;
    }
    public List<Emp> getEmps() {
        return emps;
    }
    public void setEmps(List<Emp> emps) {
        this.emps = emps;
    }
    @Override
    public String toString() {
        return "Dept [deptId=" + deptId + ", deptName=" + deptName + ", emps=" + emps + "]";
    }   

}

App.java
public class App {

    public static void main(String[] args) {

        Emp emp1 = new Emp(1, "X");
        Emp emp2 = new Emp(2, "Y");
        Emp emp3 = new Emp(3, "Z");
        List<Emp> empList = new ArrayList<>(Arrays.asList(emp1, emp2, emp3));

        Dept dept1 = new Dept(1, "Physics");
        Dept dept2 = new Dept(2, "Math");
        Dept dept3 = new Dept(3, "Chemistry");
        List<Dept> deptList = new ArrayList<>(Arrays.asList(dept1, dept2, dept3));

        emp1.setDepts(deptList);
        dept2.setEmps(empList);

        SessionFactory factory = new Configuration().configure("hibernate.cfg.xml").addAnnotatedClass(Emp.class)
                .addAnnotatedClass(Dept.class).buildSessionFactory();

        Session session = factory.openSession();
        session.beginTransaction();

        //Write business logic
        session.save(emp1);
        session.save(emp2);
        session.save(emp3);

        session.save(dept1);
        session.save(dept2);
        session.save(dept3);

        Emp e = session.get(Emp.class, 1);
        List<Dept> depts = e.getDepts();

        for(Dept d : depts)
            System.out.println(e.getEmpId()+" .. "+d.getDeptId()+" .. "+d.getDeptName());


        session.getTransaction().commit();
        session.close();

В файле конфигурации: когда я указываю hbm2ddl.auto как 'create', он дает мне ожидаемый результат, как показано ниже: Подробности Emp 1 .. 1 ..Физика 1 .. 2 .. Математика 1 .. 3 .. Химия

, но когда я изменяю ее на «обновление» и комментирую операции сохранения, которые я делал в App.java, это дает мне результат ниже.1 .. 2 .. Math

Почему несоответствие в результате.Пожалуйста, помогите.

1 Ответ

0 голосов
/ 22 января 2019

Для сущности Emp добавьте это

@ManyToMany(cascade = {
    CascadeType.PERSIST,
    CascadeType.MERGE,
    CascadeType.DELETE
})
@JoinTable(name = "EMP_DEPT",
    joinColumns = @JoinColumn(name = "emp_id"),
    inverseJoinColumns = @JoinColumn(name = "dept_id")
)
private List<Dept> depts= new ArrayList<>();

Если вы хотите, чтобы отношение было двунаправленным, добавьте следующую часть кода в класс Dept:

 @ManyToMany(cascade = {
    CascadeType.PERSIST,
    CascadeType.MERGE,
    CascadeType.DELETE
})
@JoinTable(name = "EMP_DEPT",
    joinColumns = @JoinColumn(name = "emp_id"),
    inverseJoinColumns = @JoinColumn(name = "dept_id")
)
private List<Emp> emps= new ArrayList<>();

При таком способе сопоставления вам не нужно вставлять в кросс-таблицу, а просто устанавливать для сущностей (в данном случае это исключение e Dept) связанный список.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...