Witam,

Chciałbym się zapytać jak obsługujecie formularze dynamiczne za pomocą DataBinder oraz Hibernate ?

Mam 2 klasy:

public class User {
    @Id @GeneratedValue
    private int id;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "user")
    private List<Role> roles = new ArrayList<>();
}
public class Role {
    @Id @GeneratedValue
    private int id;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "user_id", nullable = false)
    private User user;
}

Za pomocą jQuery mogę dodawać/usuwać nowe role. Więc HTML będzie wyglądać mniej więcej w ten sposób:

<input type="text" name="roles[0].name" />
<input type="text" name="roles[1].name" />

Problem polega na tym, że jak edytujemy użytkownika to nie wiemy czy te istniejące role (z foreach) już istaniły czy zostały dodane. Więc stwierdziłem, że dodam do tego formularza jeszcze ID encji:

<input type="text" name="roles[0].name" />
<input type="hidden" name="roles[0].id" />

Wszystko porządnie się binduje, już nie insert`uje istniejących danych. Ale pytanie brzmi, co będzie, gdy zmienie ID w formularzu (oczywiście jest nie widoczne pole ale za pomocą "Zbadaj element" np: z Chrome). Oczywiście zmienię nie tą encję, którą chciałem. Nasuwa się kolejne pytanie: Jak się przed tym ustrzec ? Wydaje mi się, że może być wiele sposobów na to. Jedynie co mi przyszło do głowy, to w serwisie pobrać encje i sprawdzić czy jeśli id jest różny od tej co w formularzy to albo rzygnąć wyjątkiem albo nie uświadamiać użytkownika, że to zostało pominięte.

Przetestowałem jeszcze: AutoPopulatingList

public class User {
    @Id @GeneratedValue
    private int id;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "user")
    private List<Role> roles = new AutoPopulatingList<Role>(new AutoPopulatingList.ElementFactory<Role>() {
        @Override
        public Role createElement(int index) throws AutoPopulatingList.ElementInstantiationException {
            Role role = new Role();
            role.setUser(User.this);
            return role;
        }
    });
}

Prosiłbym o wasze opinie jak to rozwiązaliście.

Pozdrawiam

Ktoś mógłby się wypowiedzieć na ten temat ?
Bardzo mi zależy na odpowiednim rozwiązaniu bo nie chciałbym od początku źle zrobić aplikacji.