代码之家  ›  专栏  ›  技术社区  ›  Royce

如何使用jpa管理多个实体?

  •  0
  • Royce  · 技术社区  · 6 年前

    上下文

    我试图创建一个简单的api来学习spring boot和jpa。信息存储在h2数据库中。

    我有两个实体: mission user .

    有几个用户被分配到一个任务。用户可以被分配到不同的任务。

    所以,我的班级 Mission 有一个属性 private ArrayList<User> users; .

    目标

    我的目标是创建一些请求:

    • (获取请求) IP/missions/123456/users :获取分配给任务的所有用户 123456
    • (提出请求) IP/missions/456789 :分配给任务的用户 456789

    所以,把两个实体都绑起来。

    有问题的

    但我不知道如何存储/绑定与 使命 用户 . 好的方法是用这个方案创建一个“关联表” Assignements(id_user, id_mission) ?

    谢谢你的帮助!

    编辑1:代码

    实体使命

    @Entity
    public class Mission{
    
        @Id
        private String id;
        private String name;
        private Date start;
        private Date end;
        private ArrayList<User> users;
        private int status;
    
        public Mission() {
        }
    
        public Mission(String name, Date start, Date end) {
            this.name = name;
            this.start = start;
            this.end = end;
            this.status = 0;
        }
    
        // getters and setters
    }
    

    实体用户

    @Entity
    public class User {
    
        @Id
        private String id;
        private String name;
    
        public User() {
        }
    
        public User(String name) {
            this.name = name;
        }
    
        // getters and setters
    }
    

    SQL

    我使用一个sql脚本。目前,脚本看起来像:

    INSERT INTO mission (id, name, start, end, status) VALUES ('de7d9052-4961-4b4f-938a-3cd12cbe1f82', 'mission 1', '2019-02-11', '2019-02-13', 0)
    INSERT INTO mission (id, name, start, end, status) VALUES ('425e7701-02c6-4de3-9333-a2459eece1c8', 'mission 2', '2019-02-10', '2019-02-15', 0)
    

    编辑2:新代码(使用@manytomany)

    实体

    @Entity
    public class Mission {
    
        @Id
        private String missionid;
        private String namemission;
        private Date start;
        private Date end;
        @ManyToMany
        @JoinTable(name = "mission_user",
            joinColumns = @JoinColumn(name = "missionid"),
            inverseJoinColumns = @JoinColumn(name = "userid")
        )
        private Set<User> users = new HashSet<>();
        private int status;
    
        public Mission() {}
    
        public Mission(String name, Date start, Date end) {
            this.namemission = name;
            this.start = start;
            this.end = end;
            this.status = 0;
        }
    }
    
    @Entity
    public class User {
    
        @Id
        private String iduser;
        private String nomuser;
        @ManyToMany(mappedBy = "users")
        private Set<Mission> missions = new HashSet<>();
    
        public User() {}
    
        public User(String nom) {
            this.nomuser = nom;
        }
    
    }
    

    仓库

    @RepositoryRestResource(collectionResourceRel = "mission")
    public interface MissionResource extends JpaRepository<Mission, String> {
        ...
    }
    
    @RepositoryRestResource(collectionResourceRel = "user")
    public interface UserResource extends JpaRepository<User, String> {
        ...
    }
    

    休息控制器

    @RestController
    @RequestMapping(value = "/missions", produces = MediaType.APPLICATION_JSON_VALUE)
    @ExposesResourceFor(Mission.class)
    public class MissionRepresentation {
        private final MissionResource missionResource;
        private final UserResource userResource;
    
        public MissionRepresentation(MissionResource missionResource, UserResource userResource) {
            this.missionResource = missionResource;
            this.userResource = userResource;
        }
    
        // mapping
    }
    
    0 回复  |  直到 5 年前
        1
  •  1
  •   Andronicus    6 年前

    最好是实现一个连接表,正如您所说的。可能是这样的:

    create table mission_user (
        mission_id int,
        user_id int,
        primary key (mission_id, user_id)
    )
    

    然后 @ManyToMany 使用此表作为映射或类似实体 MissionUser 同时绘制地图 User Mission 作为 @OneToMany 对它。

        2
  •  1
  •   Toseef Zafar    6 年前

    任务类将有:

    @Entity
    public class Mission {
    ...
        @ManyToMany(mappedBy = "missions")
        private List<User> users;
    ...
    }
    

    用户类将具有:

    @Entity
    public class User {
    ...
    
        @ManyToMany(mappedBy = "users")
        private List<Mission> missions;
    ...
    }
    

    这将在数据库中创建一个名为missions的表,其中只有missionid和userid列。