2016-06-04 3 views
0

Ich habe 2 Tabellen (Benutzer und Announcement) können jetzt mehr Benutzer eine Ansage zugeordnet werden (bezogen viele zu viele ist), In meinem Controller habe ich:Insert nur in viele zu viele Hibernate

@Autowired 
private AnnouncementService announcementService; 

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

Ich möchte diese Objekte nicht wieder in meiner DB speichern, ich möchte nur Beziehungen in meinem dritten Objekt speichern ("Assigned_Users"). bestehen bleiben jetzt sollte ich so etwas tun:

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>(); 

Der Benutzer und die Ankündigung, die ich habe es bereits in der DB sind, will ich nicht retten die schon wieder. Wie kann ich dieses Problem lösen, und nur in vielen zu viele Tabelle einfügen

Antwort

0

Zuerst müssen Sie nur die offene Seite der Beziehung mit @JoinTable zuordnen. Auf der anderen Seite müssen Sie nur mappedBy Attribut festlegen. So wird Ihre Beziehung so aussehen

@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>(); 

Zweitens sollte diese Art von Logik in der Serviceklasse sein, nicht in der Steuerung. Vom Controller sollten Sie die IDs einfach an die Service-Methode übergeben und dann die benötigten Entitäten nach ihrer ID in der Serviceklasse abrufen. So etwas wie dieses

// 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); 
} 
+0

diese Funktion vom Dienst wird wieder Ansage und Benutzer speichern? oder einfach die Daten von vielen auf viele aktualisieren? – cityboycity1

+0

Es sollte nur die vorhandenen Daten aktualisieren. –

Verwandte Themen