2017-12-18 16 views
0

私は少しこれに悩まされています。何が起こっているのかを理解するために助けを求めています。私は自動インクリメントされたIdを生成することができず、Idleとして常に1を生成します。

だから、私はこのテーブル(DDL)を持つ:

CREATE TABLE `users` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `firstname` varchar(45) NOT NULL, 
    `lastname` varchar(45) NOT NULL, 
    `email` varchar(60) NOT NULL, 
    `password` varchar(100) NOT NULL, 
    `enabled` tinyint(1) NOT NULL, 
    `created_at` datetime DEFAULT NULL, 
    `image_id` int(11) NOT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `email_UNIQUE` (`email`), 
    KEY `FK17herqt2to4hyl5q5r5ogbxk9` (`image_id`), 
    CONSTRAINT `FK17herqt2to4hyl5q5r5ogbxk9` FOREIGN KEY (`image_id`) REFERENCES `images` (`id`), 
CONSTRAINT `fk_users_images1` FOREIGN KEY (`image_id`) REFERENCES `images` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION 
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1 

そして、私のエンティティ:

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

    private static final long serialVersionUID = 6304869652591140818L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "id", updatable = false, nullable = false) 
    private Long id; 

    @Column(name = "firstname") 
    private String firstname; 

    @Column(name = "lastname") 
    private String lastname; 

    @Column(name = "email") 
    private String email; 

    @Column(name = "password") 
    @Transient 
    private String password; 

    @Column(name = "enabled") 
    private int enabled; 

    @Column(name = "created_at") 
    private LocalDateTime createdAt; 

    @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL) 
    @JoinTable(name = "users_has_roles", 
     joinColumns = @JoinColumn(name = "user_id"), 
     inverseJoinColumns = @JoinColumn(name = "role_id")) 
    private Set<Role> roles; 

    @MapsId 
    @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL) 
    private Image image; 

    // Setters and Getters 
} 

私はこのコードを使用して新しいユーザーを保持しようとしています:

@PersistenceContext 
private EntityManager em; 

@Transactional 
public void createUser(NewUserDto newUser) { 

    User user = new User(); 
    user.setFirstname(newUser.getFirstname()); 
    user.setLastname(newUser.getLastname()); 
    user.setEmail(newUser.getEmail()); 
    user.setEnabled(ENABLED); 
    user.setPassword(bCryptPasswordEncoder.encode(newUser.getPassword())); 

    Image userImage = imageService.getImageById(1L); 
    user.setProfileImage(userImage); 


    Set<Role> roles = new HashSet<Role>(); 

    Role role = roleRepository.findByName(newUser.getRole()); 
    roles.add(role); 

    user.setRoles(roles); 

    if (user.getId() == null) { 
     em.persist(user); 
     em.flush(); 
    } else { 
     em.merge(user); 
    } 

} 

私がデバッグすると、常に新しいユーザーのID = 1が生成されることがわかります。

しかし、データベースでは、私はすべて正しいと思う。

enter image description here

と私は、次を取得し、すべてのユーザーを検索する場合:

public List<User> getAll() { 
    return userRepository.findAll(); 
} 

enter image description here

同じJPDAのObjectReference。

何か助けが歓迎されます。

ありがとうございました。

答えて

1

(コメントを残すのに十分な評判を持っていないために謝罪)

私は明らかにあなたの質問を理解していません。とにかく私はあなたの問題だと思っていることに基づいて説明しようとします。

  • デフォルトでは、AUTO_INCREMENTの開始値は1で、新しいレコードごとに が1ずつ増えます。そのような動作が期待されます。
  • 値が1でない場合は、適切な変更を加えて GenerationType.SEQUENCEを使用する必要があります。
  • 画像1:あなたは値がデータベースに正しく に入力得ていることに言及しており、これは、IDの値が が
  • Image2の正しく生成されていることを示しています。ユーザーは、Javascriptの配列です。 javascript のインデックス値は常にゼロから始まります。これはインデックス値であり、id値は ではありません。同様に、右側に記載されているIDは のjavascriptの内部オブジェクトIDであり、ユーザーの実際のIDではありません。
  • これは、あなたの質問に答えていない場合は位置0

でユーザーを展開し、ユーザーの実際のIDを確認するには、親切にあなたの質問とまさにエラーや問題がある手の込んだ。

1

GenerationType.AUTOのHibernateのフォールバックはGenerationType.SEQUENCEですが、ほとんどの人が望むのはGenerationType.IDENTITYなので、この問題は誤解されていますので、データベースから割り当てられたIDを使用できます。戦略をIDENTITYに変更するだけで問題は解決します。

関連する問題