【问题标题】:Insert just in many to many Hibernate仅在多对多 Hibernate 中插入
【发布时间】:2016-10-04 10:52:42
【问题描述】:

我有 2 个表(用户和公告),现在可以将更多用户分配给一个公告(关系是多对多的), 在我的控制器中,我有:

@Autowired
private AnnouncementService announcementService;

    User user = (User) httpSession.getAttribute("userAccount");
    Announcement announcement = announcementService.getAnnouncement(announcementId);
    user.getAssignedUsersToAnnouncement().add(announcement);
    announcement.getAnnouncementsAssignedToUsers().add(user);

我不想在我的数据库中再次保存这些对象,我只想将关系保存在我的第三个对象(“Assigned_Users”)中。 现在要坚持下去,我应该这样做:

announcementService.save(announcement); //due to this will be dublicates in my table

Announcement class{
   @ManyToMany(fetch = FetchType.EAGER)
   @JoinTable(name = "Assigned_Users",
           joinColumns = {@JoinColumn(name = "anunt_id")},
            inverseJoinColumns = {@JoinColumn(name = "user_id")} )
   private Set<User> announcementsAssignedToUsers = new HashSet<User>();
}

@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "Assigned_Users",
        joinColumns =  {@JoinColumn(name = "user_id")},
        inverseJoinColumns = {@JoinColumn(name = "anunt_id")})
private Set<Announcement> assignedUsersToAnnouncement = new HashSet<Announcement>();

我得到的用户和公告已经在数据库中,我不想再次保存它们。我怎样才能解决这个问题,并在多对多表中插入

【问题讨论】:

    标签: hibernate spring-mvc jpa orm


    【解决方案1】:

    首先,您只需要将关系的 ope 侧映射到@JoinTable。另一方面,您只需要设置mappedBy 属性。所以你的关系看起来像这样

    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(name = "Assigned_Users",
           joinColumns = {@JoinColumn(name = "anunt_id")},
            inverseJoinColumns = {@JoinColumn(name = "user_id")} )
    private Set<User> announcementsAssignedToUsers = new HashSet<User>();
    
    
    @ManyToMany(fetch = FetchType.EAGER, mappedBy = "announcementsAssignedToUsers")
    private Set<Announcement> assignedUsersToAnnouncement = new HashSet<Announcement>();
    

    其次,这种类型的逻辑应该在服务类中,而不是在控制器中。从控制器您应该只将 id 传递给服务方法,然后通过服务类中的 id 获取所需的实体。像这样的

    // controller
    @Autowired
    private AnnouncementService announcementService;
    
        announcementService.assignUserToAnnouncement(user.getId(), annoucmentId);
    
    // service
    
    @Transactional
    public void assignUserToAnnouncement(Long userId, Long announcementId) {
        User user = userRepository.getById(userId);
        Announcement announcement = annRepository.getById();
        user.getAssignedUsersToAnnouncement().add(announcement);
        announcement.getAnnouncementsAssignedToUsers().add(user);
        annRepository.save(announcement);
        userRepository.save(user);
    }
    

    【讨论】:

    • 服务中的这个功能会再次保存通知和用户吗?还是只是从多到多更新数据?
    猜你喜欢
    • 2018-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-12
    相关资源
    最近更新 更多