我有两节课.

"poll.java."

public class Poll {
    @Id
    @Column(name = "poll_id")
    String pollId;
    String question;
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")
    String endDateTime;

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
    @JoinColumn(name = "poll_id_fk", referencedColumnName = "poll_id")
    List<Choice> choices;
}

哦, Select .我本来是.

public class Choice {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "choice_id")
    Long choiceId;
    String text;
    Integer votes;
}

当我创建新的投票时,CHOICE_ID从上次创建的CHOICE_ID的数字开始递增.如何在创建新的轮询时使Choose_id重置其值?

我try 更改策略GenerationType,但似乎没有任何影响.我期待着这样的结果:

[
    {
        "pollId": "MvWRj",
        "question": "poll 2?",
        "endDateTime": "2023-07-09 19:50",
        "choices": [
            {
                **"choiceId": 1,**
                "text": "choice 1",
                "votes": 1
            },
            {
                **"choiceId": 2,**
                "text": "choice 2",
                "votes": 0
            }
        ]
    },
    {
        "pollId": "V838D",
        "question": "poll 1?",
        "endDateTime": "2023-07-09 19:50",
        "choices": [
            {
                **"choiceId": 1,**
                "text": "choice 1",
                "votes": 1
            },
            {
                **"choiceId": 2,**
                "text": "choice 2",
                "votes": 0
            }
        ]
    }
]

鉴于我得到的结果如下:

[
    {
        "pollId": "MvWRj",
        "question": "poll 2?",
        "endDateTime": "2023-07-09 19:50",
        "choices": [
            {
                **"choiceId": 3,**
                "text": "choice 1",
                "votes": 1
            },
            {
                **"choiceId": 4,**
                "text": "choice 2",
                "votes": 0
            }
        ]
    },
    {
        "pollId": "V838D",
        "question": "poll 1?",
        "endDateTime": "2023-07-09 19:50",
        "choices": [
            {
                **"choiceId": 1,**
                "text": "choice 1",
                "votes": 1
            },
            {
                **"choiceId": 2,**
                "text": "choice 2",
                "votes": 0
            }
        ]
    }
]

推荐答案

要实现您正在寻找的行为--每新建Poll个重置choiceId个--您需要对当前的实现进行一些更改.主要问题是,Choice类中的@GeneratedValue(strategy = GenerationType.AUTO)为所有Poll个实体中的每个Choice个实体生成一个唯一的标识符,从而导致在不同的轮询中递增ID.

以下是你可能会考虑的几种方法:

1.人工ID管理

您可以手动管理choiceId,而不是使用@GeneratedValue.这种方法要求您在创建选项或将选项添加到民意调查时, for each Choice设置相对于其PollchoiceId.但是,这可能会变得复杂且容易出错,特别是在并发事务的情况下.

2.复合键

考虑 for each 选项使用既包含pollId又包含附加标识符的复合键.这样,choiceId可以仅在每个Poll的范围内是唯一的.组合密钥可以在JPA中使用@Embeddable@EmbeddedId来实现.

复合键类的示例:

@Embeddable
public class ChoiceId implements Serializable {
    private String pollId;
    private Long choiceNumber; // This resets for each Poll

    // getters, setters, hashCode, equals
}

在您的Choice类中,您将使用ChoiceId作为主键.

3.数据库级解决方案

如果您的数据库支持序列号,您可以使用特定于数据库的特性,该特性允许根据条件重置序列号(如创建新的Poll).这是特定于数据库的,可能不能跨不同的数据库系统移植.

4.在民意调查中使用计数器

Poll实体中添加一个计数器,用于跟踪 Select 的数量.每次添加新选项时,递增此计数器并将其用作choiceId.这确保了choiceId在每个轮询中是唯一的,但对于每个新轮询都会重置.

5.业务逻辑层

在服务层或业务逻辑层中处理choiceId生成,在这里您可以对ID生成逻辑进行更多的控制.这将涉及根据特定民意调查的现有 Select 计算下一个choiceId.

Select 正确的方法

在复杂性、易实施性和可维护性方面,每种方法都有自己的取舍.最佳方法取决于您的特定要求和应用程序运行的环境.

例如,如果您想让事情变得简单并避免修改数据库模式,那么手动ID管理或在业务逻辑层处理可能是可行的.另一方面,如果您需要一个伸缩性更好的更健壮的解决方案,那么考虑组合键或数据库级别的解决方案可能更合适.

Java相关问答推荐

在FML中删除关键帧动画

无法在Java中将hhmmss格式的时间解析为LocalTime

如何使用CSS为选定但未聚焦的表格行设置背景 colored颜色 ?

如果给定层次 struct 级别,如何从其预序穿越构造n元树

转换为Biggram

为什么一个java函数会返回一个作为参数传递给它的对象?

springboot start loge change

调用引发泛型异常的泛型方法时出现编译错误

Java 21虚拟线程执行器的性能比池化操作系统线程的执行器差?

计算两个浮点数之间的距离是否对称?

当返回Mono<;Something>;时,不会调用Mono<;void>;.flatMap

对字符串长度进行排序,但颠倒了顺序(最长字符串在前)

Java SSLKeyManager出厂密码

在Oracle JDBC连接中,连接失效和身份验证失效是什么意思?

为什么StandardOpenOption.CREATE不能通过Ubuntu在中小企业上运行?

我的代码是线程安全的吗?[Java、CAS、转账]

我们可以在方法中声明接口吗?

在Spring Boot中使用咖啡因进行缓存

使用同步方法中的新线程调用同步方法

当我将JTextField的getText函数与相等的String进行比较时;t返回true