Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 休眠多对多映射,更新多个父级中的同一子级_Java_Hibernate_Jpa_Many To Many - Fatal编程技术网

Java 休眠多对多映射,更新多个父级中的同一子级

Java 休眠多对多映射,更新多个父级中的同一子级,java,hibernate,jpa,many-to-many,Java,Hibernate,Jpa,Many To Many,我创建了两个实体,项目和员工。一个项目可以有多个员工,多个项目可以有多个员工,所以我选择了许多关系,如果它是错误的,请纠正我。因为我必须检索我的员工工作的所有项目以及属于一个项目的所有员工。 下面是示例实体类 @Entity @Table(name = "projects") public class Project { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id;

我创建了两个实体,项目和员工。一个项目可以有多个员工,多个项目可以有多个员工,所以我选择了许多关系,如果它是错误的,请纠正我。因为我必须检索我的员工工作的所有项目以及属于一个项目的所有员工。 下面是示例实体类

@Entity
@Table(name = "projects")
public class Project {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "project_employee", joinColumns = @JoinColumn(name = "project_id"), inverseJoinColumns = @JoinColumn(name = "employee_id"))
    private Set<Employee> employee;

}

@Entity
@Table(name = "employees")
@Getter
@Setter
public class Employee {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToMany(mappedBy = "employee")
    @JsonBackReference
    private Set<Project> project = new HashSet<Project>();

    private String status;
}
@实体
@表(name=“projects”)
公共类项目{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私人长id;
@多个(级联=级联类型.ALL)
@JoinTable(name=“project\u employee”,joinColumns=@JoinColumn(name=“project\u id”),inverseJoinColumns=@JoinColumn(name=“employee\u id”))
私人雇员;
}
@实体
@表(name=“employees”)
@吸气剂
@塞特
公营雇员{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私人长id;
@许多(mappedBy=“employee”)
@JsonBackReference
私有集项目=新HashSet();
私有字符串状态;
}
假设有两个id为1和2的项目 4名id为1,2,3,4的员工

员工1、2、3是第一个项目的一部分 员工2、3、4是第二个项目的一部分

员工2已完成第一个项目,因此应为第一个项目完成员工实体状态 员工2在第二个项目中被阻止,因此员工实体状态应在第二个项目中被阻止

所以我面临的问题是,如果我更新第一个项目的员工2状态,第二个项目也会出现同样的情况,反之亦然


因此,如何解决这个问题,我是否需要通过添加员工和项目映射为状态创建单独的实体。

在第一个和第二个项目中工作的员工2始终是相同的条目。 更新员工状态时,将为两个项目更新该状态,因为两个项目使用相同的条目

如果您想持久化,员工2完成了项目1的工作,但仍在项目2上工作,则需要一个单独的表,用于保存有关状态、员工id和项目id的信息

@Entity
@Table(name = "projects")
public class Project {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "project_employee", joinColumns = @JoinColumn(name = "project_id"), inverseJoinColumns = @JoinColumn(name = "employee_id"))
    private Set<Employee> employee;

}

@Entity
@Table(name = "employees")
@Getter
@Setter
public class Employee {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToMany(mappedBy = "employee")
    @JsonBackReference
    private Set<Project> project = new HashSet<Project>();

    @OneToMany
    private Set<Status> status = new HashSet<Status>();
}

@Entity
@Table(name = "status")
public class Status {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id
    private String status; // completed, in progress, ... (think about making an enum)
    @ManyToOne
    private Employee employee;
    @ManyToOne
    private Project project;
}
@实体
@表(name=“projects”)
公共类项目{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私人长id;
@多个(级联=级联类型.ALL)
@JoinTable(name=“project\u employee”,joinColumns=@JoinColumn(name=“project\u id”),inverseJoinColumns=@JoinColumn(name=“employee\u id”))
私人雇员;
}
@实体
@表(name=“employees”)
@吸气剂
@塞特
公营雇员{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私人长id;
@许多(mappedBy=“employee”)
@JsonBackReference
私有集项目=新HashSet();
@独身癖
私有集状态=新HashSet();
}
@实体
@表(name=“status”)
公共阶级地位{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私人长id
私有字符串状态;//已完成,正在进行,…(考虑创建枚举)
@许多酮
私人雇员;
@许多酮
私人项目;
}

是,项目id、员工id和状态谢谢。新实体的外观。在设计员工和项目实体时,有没有更好的方法?我认为有更好的方法可以做到这一点,让project_employee成为一个新的实体,并在其中添加状态栏,我知道了,但是如何将员工和项目连接到project_employee。我想通过在project和employee中创建project_employee列表来实现。谢谢。新实体将是什么样子的。@vighneshwar我没有尝试过,但它应该是这样的。我会检查的。谢谢你。@vighneshwar有用吗?如果是,请接受答案