2016-11-28 2 views
0

In meiner Spring MVC/JPA-Anwendung habe ich Benutzer- und Abteilungsentitäten in Bezug auf ihre Datenbanktabellen definiert. In der Regel können viele Benutzer zu einer Abteilung gehören, so habe ich die folgenden in meinem BenutzerklasseZuordnen geschachtelter Objekt-IDs im Frühling JPA

@Entity(name = "USER") 
public class User { 

    @Id 
    @Column(name = "Username") 
    private String username; 

    @ManyToOne 
    @JoinColumn(name = "Department") 
    private Department department; 

} 

Wenn es Zeit ist, ich einen neuen Benutzer speichern muss assoziieren den Benutzer mit einer ID Abteilung

User 
username  | BobbySurfs2020 
departmentId | 43 

muss ich brauchen ein zusätzliches departmentId Feld auf meinem Benutzerobjekt definiert haben nur diese Assoziation zu machen, oder kann ich irgendwie das eingebettete Abteilung Objekt verwenden setDepartment() diese ID über meine Setter zu setzen?

Update/Weitere Gedanken:

Ist es überhaupt notwendig Department im User Objekt verschachtelt zu haben wie ich hier habe? Ich denke, dass es mehr Speicher aufnehmen würde, um einen Department für jeden Benutzer zu speichern, den ich abhole, als es nur die Department IDs zuordnen würde. Auf diese Weise konnte ich, wenn ich zu jeder Zeit eine Abteilungsinfo brauchte, einfach nach der ID suchen, die dem Benutzer zugeordnet ist. Gedanken?

Vielen Dank!

+0

nicht einfach departmanId in Benutzertabelle in db hinzufügen danach nur über Namen holen departman und dann auf Benutzer eingestellt departman und speichern Sie es auch Joincolumn ändern (departman) mit joincolumn (departmanid) –

+0

Danke @mithatkonuk. Ich denke auch, dass es notwendig sein könnte, "Abteilung" überhaupt zu speichern und die ID stattdessen zu verwenden –

+0

Thats wegen der Beziehung, die Sie gerade departman geben, die in db so gespeichert wird, wie Sie komplizierten Prozess wegbleiben können, können Sie auch Identifikation in verwenden Benutzerklasse zu setzen und zu speichern kann auch sein, aber ich schlage Ihnen vor, auf diese Weise wird mehr cool sein –

Antwort

1

Muss ich ein zusätzliches departmentId-Feld auf meinem Benutzerobjekt definiert haben, nur um diese Zuordnung zu machen.

Keine

Ist es überhaupt nötig zu haben Abteilung im User-Objekt verschachtelt wie ich hier habe?

Ja. Sie verwenden ein Objekt Relational Mapper so Kartenobjekte.

In der MVC-Welt können Sie dies leicht mit Hilfe eines Konverters handhaben, der die ID von der UI übernimmt, die relevante Entität nachschlägt und diese auf die zu bearbeitende Entität setzt.

@Component 
public class StringToDepartmentConverter implements Converter<String, Department> { 

    @Autowired 
    private DepartmentService service; 

    /** 
    *departmentId is the HTTP post param passed in by the framework 
    */ 
    public Department convert(String departmentId) { 
     return service.findDepartment(Integer.parseInt(departmentId)); 
    } 
} 

Register dies mit dem Rahmen:

@Configuration 
@EnableWebMvc 
@ComponentScan(basePackages = { "..." }) 
public class MvcConfiguration extends WebMvcConfigurerAdapter{ 

    //other configuration 

    @Override 
    public void addFormatters(FormatterRegistry formatterRegistry) { 
     formatterRegistry.addConverter(departmentConverter()); 
    } 

    @Bean 
    public StringToDepartmentConverter departmentConverter(){ 
     return new StringToDepartmentConverter(); 
    } 
}