2017-12-18 10 views
0

저는이 문제에 약간의 당황 스러워요. 무슨 일이 일어나고 있는지 이해하기 위해 도움을 요청하고 있습니다.자동 증가 ID를 생성 할 수없고 최대 절전 모드는 항상 Id를 1로 생성합니다.

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 
} 

:

그래서,이 테이블 (DDL)가

@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 값이 는
  • 이미지 2 올바르게 생성되고 있음을 보여줍니다 사용자가 자바 스크립트 배열입니다. 자바 스크립트 의 색인 값은 항상 0부터 시작합니다. 그것은 인덱스 값이며 id 값은 이 아닙니다. 마찬가지로, 오른쪽에 언급 된 ID는 자바 스크립트의 내부 개체 ID이며 사용자의 실제 ID는 아닙니다. 이 친절하게, 당신의 질문에 대답 질문과 정확히 어떤 오류 또는 문제가 정교하지 않는 경우
  • 의 위치는 0

에서 사용자를 확장, 사용자의 실제 ID를 참조하십시오.

1

GenerationType.AUTO에 대한 Hibernate의 폴백이 GenerationType.SEQUENCE 인 반면, 대부분의 사람들이 원하는 것은 GenerationType.IDENTITY인데, 데이터베이스에서 할당 한 ID를 사용할 수 있기 때문에 오해가 발생합니다. 간단히 전략을 IDENTITY으로 변경하면 문제가 해결됩니다.