Spring不会将列表保存在oneToMany关系中

问题描述 投票:0回答:1

我有这个地址实体

package com.appdeveloperblog.app.ws.io.entity;

import java.io.Serializable;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;

@Entity(name = "addresses")
public class AddressEntity implements Serializable {
private static final long serialVersionUID = 3652691377296902875L;

@Id
@GeneratedValue
private long id;

@Column(length = 30, nullable = false)
private String addressId;

@Column(length = 15, nullable = false)
private String city;

@Column(length = 15, nullable = false)
private String country;

@Column(length = 100, nullable = false)
private String streetName;

@Column(length = 7, nullable = false)
private String postalCode;

@Column(length = 10, nullable = false)
private String type;

@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "users_id")
private UserEntity userDetails;

public long getId() {
    return id;
}

public void setId(long id) {
    this.id = id;
}

public String getAddressId() {
    return addressId;
}

public void setAddressId(String addressId) {
    this.addressId = addressId;
}

public String getCity() {
    return city;
}

public void setCity(String city) {
    this.city = city;
}

public String getCountry() {
    return country;
}

public void setCountry(String country) {
    this.country = country;
}

public String getStreetName() {
    return streetName;
}

public void setStreetName(String streetName) {
    this.streetName = streetName;
}

public String getPostalCode() {

        return postalCode;
    }

    public void setPostalCode(String postalCode) {
        this.postalCode = postalCode;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public UserEntity getUserDetails() {
        return userDetails;
    }

    public void setUserDetails(UserEntity userDetails) {
        this.userDetails = userDetails;
    }

}

这是一个用户实体

package com.appdeveloperblog.app.ws.io.entity;

import java.io.Serializable;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;

@Entity(name = "users")
public class UserEntity implements Serializable {

    private static final long serialVersionUID = -3772691377276902875L;

    @Id
    @GeneratedValue
    private long id;

    @Column(nullable = false)
    private String userId;

    @Column(nullable = false, length = 50)
    private String firstName;

    @Column(nullable = false, length = 50)
    private String lastName;

    @Column(nullable = false, length = 120, unique = true)
    private String email;

    @Column(nullable = false)
    private String encryptedPassword;

    private String emailVerificationToken;

    @Column(nullable = false)
    private Boolean emailVerificationStatus = false;

    @OneToMany(mappedBy = "userDetails", cascade = CascadeType.ALL)
    private List<AddressEntity> addresses;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getUserId() {
        return userId;
    }

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

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getEncryptedPassword() {
        return encryptedPassword;
    }

    public void setEncryptedPassword(String encryptedPassword) {
        this.encryptedPassword = encryptedPassword;
    }

    public String getEmailVerificationToken() {
        return emailVerificationToken;
    }

    public void setEmailVerificationToken(String emailVerificationToken) {
        this.emailVerificationToken = emailVerificationToken;
    }

    public Boolean getEmailVerificationStatus() {
        return emailVerificationStatus;
    }

    public void setEmailVerificationStatus(Boolean emailVerificationStatus) {
        this.emailVerificationStatus = emailVerificationStatus;
    }

}

以及我在服务层中使用的此功能,用于将数据保存到Mysql数据库中

@Override
    public UserDto createUser(UserDto user) {

        if (userRepository.findByEmail(user.getEmail()) != null)
            throw new RuntimeException("Record already exists");

        for(int i = 0 ; i < user.getAddresses().size() ; i++)
        {
            AddressDTO address = user.getAddresses().get(i);
            address.setUserDetails(user);
            address.setAddressId(utils.generateAddressId(30));
            user.getAddresses().set(i, address);
        }

        ModelMapper modelMapper = new ModelMapper();
        UserEntity userEntity = modelMapper.map(user, UserEntity.class);

        String publicUserId = utils.generateUserId(30);

        userEntity.setUserId(publicUserId);
        userEntity.setEncryptedPassword(bCryptPasswordEncoder.encode(user.getPassword()));

        UserEntity storedUserDetails = userRepository.save(userEntity);

        // BeanUtils.copyProperties(storedUserDetails, returnValue);

        UserDto returnValue = modelMapper.map(storedUserDetails, UserDto.class);

        return returnValue;
    }

在我使用邮递员POST请求将数据发布到API后,它仅将数据保存到users表中,并且地址表中的所有数据都被忽略了

POST请求示例:

{
"firstName" : "Sergey",
"lastName" : "Kargopolov",
"email" : "[email protected]",
"password" : "123",
"addresses":[
    {
        "city":"Vancouver",
        "country":"Canada",
        "streetName":"123 Street name",
        "postalCode": "ABCBA",
        "type":"billing"
    }
    ]
}
spring spring-boot spring-mvc servlets spring-data-jpa
1个回答
0
投票

下面的类是您要实现的精简版本。请与您的班级进行比较,它应该只能正常工作,不同之处在于我已删除了其他字段来轻松对其进行测试。检查UserController映射方法中的代码。

UserEntity.java

@Entity
@Table(name = "users")
public class UserEntity implements Serializable {

    private static final long serialVersionUID = 4865903039190150223L;
    @Id
    @GeneratedValue
    private long id;

    @Column(length = 50, nullable = false)
    private String firstName;

    @Column(length = 50, nullable = false)
    private String lastName;

    @OneToMany(mappedBy = "userDetails", cascade = CascadeType.ALL)
    private List<AddressEntity> addresses;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public List<AddressEntity> getAddresses() {
        return addresses;
    }

    @Override
    public String toString() {
        return "UserEntity [id=" + id + ", firstName=" + firstName + ", lastName=" + lastName + ", addresses="
                + addresses + "]";
    }

    public void setAddresses(List<AddressEntity> addresses) {
        this.addresses = addresses;
    }

}

AddressEntity.java

@Entity(name = "addresses")
public class AddressEntity implements Serializable {
    private static final long serialVersionUID = 3652691377296902875L;

    @Id
    @GeneratedValue
    private long id;

    @Column(length = 15, nullable = false)
    private String city;

    @Column(length = 15, nullable = false)
    private String country;

    @JsonIgnore
    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "users_id")
    private UserEntity userDetails;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getCountry() {
        return country;
    }

    public void setCountry(String country) {
        this.country = country;
    }

    public UserEntity getUserDetails() {
        return userDetails;
    }

    public void setUserDetails(UserEntity userDetails) {
        this.userDetails = userDetails;
    }

    @Override
    public String toString() {
        return "AddressEntity [id=" + id + ", city=" + city + ", country=" + country + "]";
    }

}

UserDto.java

public class UserDto implements Serializable {
    private static final long serialVersionUID = 6835192601898364280L;
    private long id;
    private String firstName;
    private String lastName;
    private List<AddressDTO> addresses;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public List<AddressDTO> getAddresses() {
        return addresses;
    }

    public void setAddresses(List<AddressDTO> addresses) {
        this.addresses = addresses;
    }

}

AddressDTO.java

public class AddressDTO {

    private long id;

    private String city;

    private String country;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getCountry() {
        return country;
    }

    public void setCountry(String country) {
        this.country = country;
    }

}

UserController.java

@RestController
public class UserController {

    @Autowired
    UserRepository repository;

    @PostMapping("map")
    @ResponseBody
    public UserEntity map(@RequestBody UserDto userDto) {
        ModelMapper modelMapper = new ModelMapper();
        UserEntity userEntity = modelMapper.map(userDto, UserEntity.class);
        for (AddressEntity address : userEntity.getAddresses()) {
            address.setUserDetails(userEntity);
        }
        repository.save(userEntity);
        return userEntity;
    }
}

样品申请:

{
"firstName" : "Sergey",
"lastName" : "Kargopolov",
"addresses":[
    {
        "city":"Vancouver",
        "country":"Canada"
    }
    ]
}

输出:

{
    "id": 7,
    "firstName": "Sergey",
    "lastName": "Kargopolov",
    "addresses": [
        {
            "id": 8,
            "city": "Vancouver",
            "country": "Canada"
        }
    ]
}
© www.soinside.com 2019 - 2024. All rights reserved.