предотвратить вставку нулевого значения в родительскую таблицу, используя отношение OneToOne в спящем режиме - PullRequest
1 голос
/ 18 июня 2019

У меня есть две таблицы User и ProfilePic с двунаправленным отображением отношений OneToOne.При загрузке изображения профиля для пользователя создается новый пользователь в базе данных с нулевым значением.Мне нужно предотвратить вставку нового пользователя и добавить значение только в таблицу ProfilePic.пожалуйста, не отмечайте как дубликаты и не голосуйте. Я новичок в спящем режиме.Вот соответствующий код:

Класс пользователя:

    @Entity
@Table(name = "user_details")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int userId;
    private String firstName;
    private String lastName;
    private String gender;
    @Temporal(TemporalType.DATE)
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date dob;
    private String email;
    private String address;
    private String username;
    private String password;
    private String phoneNumber;
    private Boolean isActive;
    private String role;
    @OneToOne(mappedBy = "user")
    private ProfilePic profilePic;
    @OneToMany(mappedBy = "user")
    private List<Login> login = new ArrayList<>();

-----getter setter---
}

Класс PrfilePic:

@Entity
public class ProfilePic {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int imageId;
    private String image_url;
    @OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinColumn(name = "userId", nullable = false)
    private User user;
---getter setter---
}

Класс репозитория:

@Override
    public void saveProfilePic(ProfilePic profilePic) {
        HibernateUtil.getSession(sessionFactory).save(profilePic);
    }

Класс контроллера:

@RequestMapping(value = "/uploadProfileimage", method = RequestMethod.POST)
    public String uploadProfileImage(@ModelAttribute User user, @ModelAttribute ProfilePic profilePic,
            @RequestParam("image") CommonsMultipartFile file, Model model) {
        String imageUrl = "";
        if (!file.getOriginalFilename().isEmpty()) {
            imageUrl = ImageUtil.writeImageToFile(file);
            profilePic.setImage_url(imageUrl);
            profilePic.setUser(user);
            pictures.add(profilePic);
            userService.saveProfilePic(profilePic);
        }
        return "redirect:/getProfile?userId=" + user.getUserId();
    }

log:

Hibernate: select next_val as id_val from hibernate_sequence for update
Hibernate: update hibernate_sequence set next_val= ? where next_val=?
Hibernate: select next_val as id_val from hibernate_sequence for update
Hibernate: update hibernate_sequence set next_val= ? where next_val=?
Hibernate: insert into user_details (address, dob, email, firstName, gender, isActive, lastName, password, phoneNumber, role, username, userId) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: insert into ProfilePic (image_url, userId, imageId) values (?, ?, ?)
Hibernate: select user0_.userId as userId1_7_0_, user0_.address as address2_7_0_, user0_.dob as dob3_7_0_, user0_.email as email4_7_0_, user0_.firstName as firstNam5_7_0_, user0_.gender as gender6_7_0_, user0_.isActive as isActive7_7_0_, user0_.lastName as lastName8_7_0_, user0_.password as password9_7_0_, user0_.phoneNumber as phoneNu10_7_0_, user0_.role as role11_7_0_, user0_.username as usernam12_7_0_, profilepic1_.imageId as imageId1_6_1_, profilepic1_.image_url as image_ur2_6_1_, profilepic1_.userId as userId3_6_1_ from user_details user0_ left outer join ProfilePic profilepic1_ on user0_.userId=profilepic1_.userId where user0_.userId=?

Ожидаемый результат: вставить данные только в таблицу ProfilePic с соответствующим идентификатором пользователя. Фактический результат: данные вставлены в обе таблицы: User и ProfilePic.Создан новый пользователь с нулевыми значениями во всех столбцах.Помощь будет высоко оценена.Я застрял в этом.

1 Ответ

0 голосов
/ 18 июня 2019

Дело в том, что вставка данных только в ProfilePic не является проблемой, если идентификатор пользователя равен NULL, поэтому ни один пользователь не связан с этим изображением.

Однако, если вы хотите вставить данные в ProfilePic С ИД пользователя, вам также необходимо вставить ассоциированного пользователя в таблицу пользователей, в противном случае ИД пользователя будет недоступен.

Так, например, в MYSQL, если вы выполните этот запрос:

INSERT INTO profile_pic (image_id, image_url, user_id) VALUES ('1', "/image", '1');

вы столкнетесь с ошибкой (Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не выполняется (stackoverflow. profile_pic, CONSTRAINT user_id FOREIGN KEY (user_id) ССЫЛКИ user (* 1013) *))) Так что в основном нет пользователя с идентификатором 1.

Решение состоит в том, чтобы использовать однонаправленное отображение, другими словами, пользователь будет ссылаться на profile_pic, а profile_pic - нет.

Вы должны изменить свою модель на что-то вроде: Класс пользователя:

    @Entity
    @Table(name = "user_details")
    public class User {
        @OneToOne
        private ProfilePic profilePic;
        // other fields, getters and setters
    }

ProfilePic класс:

@Entity
public class ProfilePic {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int imageId;
    private String image_url;
    // getters and setters
}

Тогда вы сможете вставлять только в ProfilePic. Я надеюсь, что это работает для вас!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...