Отношение OneToOne hibernate + spring-data-jpa нулевое значение в схеме-владельце - PullRequest
0 голосов
/ 10 июля 2020

Я новичок в Hibernate и JPA (в основном я работал с интеграцией хранимых процедур с использованием JDB C.). Я создал два объекта User и UserPassword с отношением OneToOne. Я пытаюсь сохранить значения в обеих таблицах (MySQL DB), но столбец UserId (foreign_key) таблицы UserPassword хранит значение null, тогда как пароль сохраняется. Исправьте мою ошибку в приведенном ниже коде:

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


    private static final long serialVersionUID = -3366411610525655274L;
    
    @Column(name = "UserId", nullable = false,unique = true)
    @GenericGenerator(name = "uuid2", strategy = "uuid2")
    @GeneratedValue(generator = "uuid2")
    @Id
    @Type(type="uuid-char")
    private UUID userId;
    
    @Embedded
    private Name name; 
    
    @Column(name = "DateOfBirth", nullable = false)
    private Date dob;
    
    @OneToOne(mappedBy="user", cascade=CascadeType.ALL)
    private Password password;

    public Password getPassword() {
        return password;
    }

    public void setPassword(Password password) {
        this.password = password;
    }

    public UUID getUserId() {
        return userId;
    }

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

    public Name getName() {
        return name;
    }

    public void setName(Name name) {
        this.name = name;
    }

    public Date getDob() {
        return dob;
    }

    public void setDob(Date dob) {
        this.dob = dob;
    }
    
}

и

@Entity
@Table(name= "UserPassword")
public class Password implements Serializable{

    private static final long serialVersionUID = -8990341903052492314L;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="PasswordId")
    private Long Id;
    
    @Column(name="Password")
    private String password;
    
    @OneToOne(cascade=CascadeType.ALL,fetch=FetchType.LAZY)
    @JoinColumn(name="UserId", referencedColumnName="UserId")
    private User user;

    public Long getId() {
        return Id;
    }

    public void setId(Long id) {
        Id = id;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
    
}

Это мои репозитории JPA:

public interface UserRepository extends JpaRepository<User, UUID>{

}

и

public interface PasswordRepository extends JpaRepository<Password, Long>{

}

и код уровня сервиса для сохранения сущностей в базе данных:

public void insertUsers(List<User> users) {
        
        List<com.poc.entity.User> usersData = ObjectMapperUtils.mapAll(users, com.poc.entity.User.class);
        
        userRepository.saveAll(usersData);
    }

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

1 Ответ

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

Это сработало, сделав небольшую модификацию в логах уровня обслуживания c.

 public void insertUsers(List<User> users) {
        
        List<com.poc.entity.User> usersData = ObjectMapperUtils.mapAll(users, com.poc.entity.User.class);
            
        usersData = usersData.stream().map(user->mapUserPassWordEntity(user)).collect(Collectors.toList());
        
        userRepository.saveAll(usersData);
    }

    private com.poc.entity.User mapUserPassWordEntity(com.poc.entity.User user) {
        Password password = new Password();
        password.setPassword(user.getPassword().getPassword());
        //set parent reference to child
        password.setUser(user);
        // set child reference to parent
        user.setPassword(password);
        return user;
    }

Тем не менее, я был бы признателен за больше предложений по лучшему подходу.

...