Как убедиться, что страна не добавляется дважды в базу данных mysql в спящем режиме, используя spring mvc отношение один ко многим? - PullRequest
0 голосов
/ 11 июля 2020

У меня две сущности, первая - студент, а вторая - адрес. Слишком много отношений ie по одному адресу может быть много учеников. Теперь у меня есть страница регистрации. Когда я впервые регистрирую, что студент говорит с названием страны United States, он сохраняется в базе данных, предоставляя первичный идентификатор как 1 для Соединенных Штатов и, соответственно, дает правильный идентификатор в базе данных студента. Но когда я снова пытаюсь зарегистрировать следующего студента с другой информацией, но с той же страной, в моем случае с Соединенными Штатами, он дает мне новый первичный ключ для той же страны. Но поскольку это одно ко многим отношениям, я думаю, есть ли что-нибудь в спящем режиме, которое сопоставляется с одним и тем же идентификатором в базе данных адресов, поэтому у меня будет только одно значение соединенных штатов в базе данных адресов. Мне нужно иметь только одну запись в базе данных США. Как лучше всего удовлетворять нужды? Спасибо

Это таблица адресов

@Entity
@Table(name = "tbl_address")
public class Address {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "address_id")
    private int addressId;

    private String country;

    @OneToMany(targetEntity = Student.class, mappedBy = "address")
    private List<Student> student;

Это таблица учеников

@Entity
@Table(name = "tbl_student")
public class Student {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "student_id")
    private int studentId;
    @Column(name = "first_Name")
    private String firstName;
    @Column(name = "second_Name")
    private String secondName;
    private String email;
    @Column(name = "mobile_no")
    private float mobileNo;
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @Temporal(TemporalType.DATE)
    private Date dob;
    private String gender;

    @ManyToOne(cascade = {CascadeType.MERGE , CascadeType.ALL} )
    @JoinColumn(name = "address_id")
    private Address address;

}

Это просто реализация в классе StudentRepositoryImpl

    @Override
    public void saveUserInfo(Student user) {
        Session session = HibernateUtil.getSession(sessionFactory);
        session.save(user);
    }

    @Override
    public void saveAddressInfo(Address address) {
        // TODO Auto-generated method stub
        Session session = HibernateUtil.getSession(sessionFactory);
            session.save(address);
    }

Ответы [ 2 ]

0 голосов
/ 11 июля 2020

Имейте отдельную таблицу для страны (это будет называться основными данными). Тогда сущность Address будет примерно такой:

@Entity
@Table(name = "tbl_address")
public class Address {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "address_id")
    private int addressId;

    @ManyToOne
    private Country country;

    @OneToMany(targetEntity = Student.class, mappedBy = "address")
    private List<Student> student;

Вы можете получить список студентов, выполняющих запрос соединения с таблицами Country и Address.

Надеюсь, это будет полезно

0 голосов
/ 11 июля 2020

Первый вариант. В пользовательском интерфейсе у вас должен быть список доступных стран (поэтому я ожидаю, что вы уже заполнили таблицу стран в базе данных). Таким образом, пользовательский интерфейс будет отображать для пользователей доступные названия стран, но на стороне сервера вы будете работать с countryId.

Второй вариант. В случае, если в пользовательском интерфейсе вы хотите, чтобы пользователи вставляли любую строку в качестве имени страны, и если вы хотите зарегистрировать страну в любом новом предоставленном названии страны. Для этого вам нужно иметь уникальный индекс в таблице стран по названию страны (вам решать, будет ли он нечувствительным к регистру или нет). Перед тем, как сохранить студенческую сущность, вы должны получить доступную страну по ее имени. если такой существует - используйте countryId с сохранением студента. если не существует - создайте новую сущность страны и используйте сгенерированный CountryId в сущности-члене.

Второй вариант рискован, так как пользователи могут указать любые значения для названий стран и, возможно, с опечаткой, поэтому первый вариант предпочтительно.

...