Saya baru mengenal Hibernate dan JPA (saya sebagian besar bekerja dengan integrasi prosedur tersimpan menggunakan JDBC.). Saya membuat dua entitas User dan UserPassword dengan hubungan OneToOne. Saya mencoba menyimpan nilai di kedua tabel (MySQL DB) tetapi kolom UserId (foreign_key) dari tabel UserPassword menyimpan nol sedangkan kata sandi disimpan. Harap perbaiki kesalahan saya dalam kode di bawah ini:

@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;
    }
    
}

Dan

@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;
    }
    
}

Ini adalah repositori JPA saya:

public interface UserRepository extends JpaRepository<User, UUID>{

}

Dan

public interface PasswordRepository extends JpaRepository<Password, Long>{

}

Dan kode lapisan layanan untuk menyimpan entitas dalam database:

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

Juga, tolong bantu saya dalam merancang pendekatan yang tepat untuk pekerjaan ini.

0
Nitish Raj 10 Juli 2020, 12:02

1 menjawab

Jawaban Terbaik

Ini bekerja dengan melakukan modifikasi kecil dalam logika lapisan layanan.

 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;
    }

Namun, saya akan menghargai lebih banyak saran untuk pendekatan yang lebih baik.

0
Nitish Raj 10 Juli 2020, 14:31