Ключ Foregine не обновляется в spring boot Jpa

#spring #spring-boot #hibernate #jpa

Вопрос:

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

И отношения, которые я использовал, были отношениями @onetoone и @onetomany.

Но после построения отношений и создания таблицы в MySQL всякий раз, когда я запускаю программу, мой внешний ключ не обновляется.

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

Я хочу, чтобы в таблице контактов был отдельный столбец для внешнего ключа. На основе этого ключа я покажу все контакты для этого конкретного пользователя.

Это моя контактная сущность…

 package com.example.jpa.contactEntities;
@Entity
@Table(name = "Contact")

public class ContactEntities {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long c_id;
    private String c_name;
    private String second_c_name;
    private String c_work;
    private String c_emali;
    private String c_phone;
    private String c_image;

    @Column(length = 5000)
    private String c_description;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "contact_id")
    private UserEntities userEntities;

    public ContactEntities() {
        super();

    }

    public ContactEntities(long c_id, String c_name, String second_c_name, String c_work, String c_emali,
            String c_phone, String c_image, String c_description, UserEntities userEntities) {
        super();
        this.c_id = c_id;
        this.c_name = c_name;
        this.second_c_name = second_c_name;
        this.c_work = c_work;
        this.c_emali = c_emali;
        this.c_phone = c_phone;
        this.c_image = c_image;
        this.c_description = c_description;
        this.userEntities = userEntities;
    }

    public long getC_id() {
        return c_id;
    }

    public void setC_id(int c_id) {
        this.c_id = c_id;
    }

    public String getC_name() {
        return c_name;
    }

    public void setC_name(String c_name) {
        this.c_name = c_name;
    }

    public String getSecond_c_name() {
        return second_c_name;
    }

    public void setSecond_c_name(String second_c_name) {
        this.second_c_name = second_c_name;
    }

    public String getC_work() {
        return c_work;
    }

    public void setC_work(String c_work) {
        this.c_work = c_work;
    }

    public String getC_emali() {
        return c_emali;
    }

    public void setC_emali(String c_emali) {
        this.c_emali = c_emali;
    }

    public String getC_phone() {
        return c_phone;
    }

    public void setC_phone(String c_phone) {
        this.c_phone = c_phone;
    }

    public String getC_image() {
        return c_image;
    }

    public void setC_image(String c_image) {
        this.c_image = c_image;
    }

    public String getC_description() {
        return c_description;
    }

    public void setC_description(String c_description) {
        this.c_description = c_description;
    }

    public UserEntities getUserEntities() {
        return userEntities;
    }

    public void setUserEntities(UserEntities userEntities) {
        this.userEntities = userEntities;
    }

    @Override
    public String toString() {
        return "ContactEntities [c_id="   c_id   ", c_name="   c_name   ", second_c_name="   second_c_name   ", c_work="
                  c_work   ", c_emali="   c_emali   ", c_phone="   c_phone   ", c_image="   c_image   ", c_description="
                  c_description   ", userEntities="   userEntities   "]";
    }

}
 

это моя пользовательская сущность…

 package com.example.jpa.userEntities;   
@Entity
@Table(name = "UserEntities")

public class UserEntities {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long userId;

    @NotBlank
    @Size(min = 2, max = 20)
    private String userName;

    @NotBlank
    @Column(unique = true)
    @Email(regexp = "^[a-zA-Z0-9.!#$%amp;'* /=?^_`{|}~-] @[a-zA-Z0-9-] (?:\.[a-zA-Z0-9-] )*$")
    private String userEmail;

    @NotNull(message = "password should not be blank")
    private String userPass;

    private boolean enable;
    private String role;

    @Column(length = 500)
    private String userAbout;

    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "userEntities", orphanRemoval = true)
    private List<ContactEntities> contactList = new ArrayList<>();

    public UserEntities() {

    }

    public String getRole() {
        return role;
    }

    public void setRole(String role) {
        this.role = role;
    }

    public long getUserId() {
        return userId;
    }

    public void setUserId(long userId) {
        this.userId = userId;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getUserEmail() {
        return userEmail;
    }

    public void setUserEmail(String userEmail) {
        this.userEmail = userEmail;
    }

    public String getUserPass() {
        return userPass;
    }

    public void setUserPass(String userPass) {
        this.userPass = userPass;
    }

    public boolean isEnable() {
        return enable;
    }

    public void setEnable(boolean enable) {
        this.enable = enable;
    }

    public String getRoll() {
        return role;
    }

    public void setRoll(String role) {
        this.role = role;
    }

    public String getUserAbout() {
        return userAbout;
    }

    public void setUserAbout(String userAbout) {
        this.userAbout = userAbout;
    }

    public List<ContactEntities> getContactList() {
        return contactList;
    }

    public void setContactList(List<ContactEntities> contactList) {
        this.contactList = contactList;
    }

    @Override
    public String toString() {
        return "UserEntities [userId="   userId   ", userName="   userName   ", userEmail="   userEmail   ", userPass="
                  userPass   ", enable="   enable   ", role="   role   ", userAbout="   userAbout   ", contactList="
                  contactList   "]";
    }

}
 

Repository of Contact
package com.example.jpa.repo;

 import java.util.List;

import com.example.jpa.contactEntities.ContactEntities;

public interface ContactRepo extends JpaRepository<ContactEntities, Integer> {  
    @Query("from ContactEntities as c where c.userEntities.userId=:u_Id")
    public List<ContactEntities> findContactsByUser(@Param("u_Id") long l);

}
 

Repository of User

 package com.example.jpa.repo;
import com.example.jpa.userEntities.UserEntities;

@EnableJpaRepositories
public interface UserRepository extends JpaRepository<UserEntities, Integer> {
    @Query("select u from UserEntities u where u.userEmail=:userEmail")
    public UserEntities getUserByUserName(@Param("userEmail") String userEmail);

}
 

User controller

 package com.example.jpa.controller;  
@Controller
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserRepository userRepository;

    @Autowired
    private ContactRepo contactRepo;

    @ModelAttribute
    public void addCommonData(Model model, Principal principal) {

        String username = principal.getName();
        System.out.println("UserName:-"   username);
        UserEntities userEntities = this.userRepository.getUserByUserName(username);

        System.out.println("User:- "   userEntities);

        model.addAttribute("userEntities", userEntities);
    }

//dash board home

    @RequestMapping("/index")
    public String dashboard(Model model, Principal principal) {

        return "normal/user_dashboard";
    }

    // open add form handler

    @GetMapping("/add-contact")
    public String openAddContactForm(Model model) {

        model.addAttribute("title", "Add contact");
        model.addAttribute("contactEntitie", new ContactEntities());

        return "normal/add_contact";
    }

    // processing and contact form

    @PostMapping("/upload")
    public String processContact(@ModelAttribute ContactEntities contactEntitie,
            @RequestParam("userImage") MultipartFile multipartFile, Principal principal, Model model,
            HttpSession session) {

        try {

            model.addAttribute("contactEntitie", new ContactEntities());

            String name = principal.getName();

            UserEntities userEntities = userRepository.getUserByUserName(name);
            userEntities.getContactList().add(contactEntitie);

            // processing and uploading file....

            if (multipartFile.isEmpty()) {

                System.out.println("File is empty");

            } else {

                // upload the the file and update

                contactEntitie.setC_image(multipartFile.getOriginalFilename());

                File saveFile = new ClassPathResource("static/img").getFile();

                // bring the folder path...
                Path path = Paths
                        .get(saveFile.getAbsolutePath()   File.separator   multipartFile.getOriginalFilename());

                Files.copy(multipartFile.getInputStream(), path, StandardCopyOption.REPLACE_EXISTING);

                System.out.println("Image is uploaded");

            }

            userRepository.save(userEntities);

            System.out.println("Datas are :"   contactEntitie);

            // message success

            session.setAttribute("message", new Messages("Your Contact is added !!! Add more...", "success"));

        } catch (Exception e) {

            System.out.println("Error: "   e.getMessage());

            e.printStackTrace();

            // error message
            session.setAttribute("message", new Messages("Something went wrong !!! Try Again", "danger"));

        }
        return "normal/add_contact";

    }

    // show Contact handler

    @GetMapping("/show-contacts")
    public String showContact(Model model, Principal principal) {

        model.addAttribute("title", "Show Contacts");

        String userName = principal.getName();
        UserEntities userEntities = userRepository.getUserByUserName(userName);

        List<ContactEntities> contactList = contactRepo.findContactsByUser(userEntities.getUserId());
        model.addAttribute("contactList", contactList);

        return "normal/show_contacts";
    }

}
 

All configuration class
User Details configuration

 package com.example.jpa.Myconfiguration;  
public class UserDetailsServiceImple implements UserDetailsService {

    @Autowired
    private UserRepository userRepository;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

        // fetching data from DB

        UserEntities userEntities = userRepository.getUserByUserName(username);

        if (userEntities == null) {
            throw new UsernameNotFoundException("Could not found user !!!");

        }

        CustomUserDetails customUserDetails = new CustomUserDetails(userEntities);

        return customUserDetails;
    }

}




package com.example.jpa.Myconfiguration;
public class CustomUserDetails implements UserDetails {

    private UserEntities userEntities;

    public CustomUserDetails(UserEntities userEntities) {
        super();
        this.userEntities = userEntities;
    }

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {

        SimpleGrantedAuthority simpleGrantedAuthority = new SimpleGrantedAuthority(userEntities.getRoll());

        return List.of(simpleGrantedAuthority);
    }

    @Override
    public String getPassword() {

        return userEntities.getUserPass();
    }

    @Override
    public String getUsername() {

        return userEntities.getUserEmail();
    }

    @Override
    public boolean isAccountNonExpired() {

        return true;
    }

    @Override
    public boolean isAccountNonLocked() {

        return true;
    }

    @Override
    public boolean isCredentialsNonExpired() {

        return true;
    }

    @Override
    public boolean isEnabled() {

        return true;
    }

}
 

Свойство приложения:-

 #Database configuration

spring.datasource.url=jdbc:mysql://localhost:3306/smartcontact
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.NonRegisteringDriver
spring.jpa.properties.hibernate.dilact=org.hibernate.dialect.Mysql8Dialect
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=false
spring.jpa.properties.hibernate.globally_quoted_identifiers=true


spring.servlet.multipart.enabled=true
spring.servlet.multipart.file-size-threshold=2KB
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB
 

Комментарии:

1. Не могли бы вы, пожалуйста, показать код, в котором вы создаете сущности и сохраняете их?

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

3. Я добавил свой репозиторий, а также свой класс контроллера….. пожалуйста, проверьте…