简体   繁体   English

Spring 引导:存储枚举 Integer 常量值到 MySQL 数据库表

[英]Spring Boot: Storing Enum Integer Constant value to MySQL Database Table

I'm a beginner in Spring Boot and Java and having following issues while trying to store VoteType Enum Constant value in the database as Integer.我是 Spring Boot 和 Java 的初学者,在尝试将 VoteType 枚举常量值作为 Integer 存储在数据库中时遇到以下问题。

  1. In MySQL DB, value for DOWNVOTE and UPVOTE is being stored as 0 and 1 respectively instead of -1 and 1.在 MySQL DB 中,DOWNVOTE 和 UPVOTE 的值分别存储为 0 和 1,而不是 -1 和 1。
  2. I am unable to print the Integer Constant value of DOWNVOTE and UPVOTE.我无法打印 Integer DOWNVOTE 和 UPVOTE 的常量值。 I've tried to do System.out.println(VoteType.UPVOTE.ordinal()), but it still prints UPVOTE instead of it's Integer value ie 1我尝试执行 System.out.println(VoteType.UPVOTE.ordinal()),但它仍然打印UPVOTE而不是 Integer 值,即1

Here's my code:这是我的代码:

VoteType.java投票类型.java

public enum VoteType {
     DOWNVOTE(-1), UPVOTE(1);

    private final int direction;

    VoteType(int direction) {
        this.direction= direction;
    }
    
    public Integer getDirection() {
        return direction;
    }
    
}

VoteService.java投票服务.java

@Service
@Transactional
@AllArgsConstructor
public class VoteService {
    
    private final VoteRepository voteRepository;
    private final PostRepository postRepository;
    private final AuthService authService;

    @Transactional
    public void vote(VoteDto voteDto) {
        Post post = postRepository.findById(voteDto.getPostId())
                .orElseThrow(() -> new PostNotFoundException("Post Not Found with ID - " + voteDto.getPostId()));
        Optional<Vote> voteByPostAndUser = 
                voteRepository.findTopByPostAndUserOrderByIdDesc(post, 
                                                                 authService.getCurrentUser());
        if (voteByPostAndUser.isPresent() &&
                voteByPostAndUser.get().getType()
                        .equals(voteDto.getVoteType())) {
            throw new MyRedditException("You have already "
                    + voteDto.getVoteType() + "'d for this post");
        }
        if (UPVOTE.equals(voteDto.getVoteType())) {
            post.setVoteCount(post.getVoteCount() + 1);
        } else {
            post.setVoteCount(post.getVoteCount() - 1);
        }

        voteRepository.save(mapDtoToVote(voteDto, post));

        postRepository.save(post);
    }

    private Vote mapDtoToVote(VoteDto voteDto, Post post) {
        return Vote.builder()
                .type(voteDto.getVoteType())
                .post(post)
                .user(authService.getCurrentUser())
                .build();
    }
}

VoteController.java投票控制器.java

@RestController
@RequestMapping("/api/votes/")
@AllArgsConstructor
public class VoteController {
    private final VoteService voteService;
    
    @PostMapping
    public ResponseEntity<Void> save(@RequestBody VoteDto voteDto){
        voteService.vote(voteDto);
        return new ResponseEntity<>(HttpStatus.CREATED);
    }

}

VoteDto.java投票给.java

@AllArgsConstructor
@NoArgsConstructor
@Data
public class VoteDto {
    private VoteType voteType;
    private Long postId;
}

Vote.java投票.java

@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Table(name = "vote")
public class Vote {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    @Column(name = "type")
    private VoteType type;  
    
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "user_id")
    private User user;
    
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "post_id")
    private Post post;
    
}

Screenshot of Vote Table where Type is getting stored as 0 and 1 instead of -1 and 1 for DOWNVOTE and UPVOTE respectively.投票表的屏幕截图,其中 Type 分别存储为 0 和 1,而不是 DOWNVOTE 和 UPVOTE 的 -1 和 1。

Please let me know if more detail is needed to answer this question.如果需要更多详细信息来回答这个问题,请告诉我。 Thanks.谢谢。

Simply define type as Integer and translate to enum in get/set methods.只需将类型定义为 Integer 并在 get/set 方法中转换为枚举。

@Column(name = "type")
private Integer type;  

public VoteType getType() {
    return VoteType.fromValue(this.type);
}

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM