【发布时间】:2018-07-22 01:56:12
【问题描述】:
我是 Hibernate 的新手,正在努力寻找一种方法来创建复合主键,该主键使用唯一字符串和自动递增(按唯一字符串顺序)长。我找到了一些资源here 和here,但仍然遇到问题。
我正在使用 Java 8、Hibernate 5、Spring Boot 1.5、Spring JDBC 5 和 MySQL 连接器 6,以及 MySQL 5.7
问题
我正在尝试为映射到票务表的实体创建主键。我希望主键类似于PROJ-1,我在很多地方都看到过,我喜欢这种约定。
理想情况下,我希望 PK 有两个部分。我想要一个唯一的项目代码,如 PROJ 和一个随该项目代码递增的票号,每张票应该是连续的:PROJ-1 PROJ-2 PROJ-3 但如果我制作另一个项目代码,如 TICK 然后它应该从一个开始:TICK-1TICK-2等等。而不是像PROJ-1PROJ-2PROJ-3TICK-4和TICK-5这样的条目。
我不确定如何使用休眠来完成此操作。
我目前的代码是这样的。
实体
更新 2 使生成的 TicketIdentifier 独一无二。
@Entity
@Table(name = "support_ticket")
public class SupportTicket implements Serializable {
private TicketIdentifier id;
... other irrelevant properties
@EmbeddedId
@AttributeOverride(name = "id", column = @Column(unique = true, nullable = false))
public TicketIdentifier getId() {
return id;
}
public void setId(TicketIdentifier id) {
this.id = id;
}
... other irrelevant getters and setters
}
可嵌入类
更新根据 cmets 将票号更改为非唯一值。
更新 2 使项目非唯一,并从票证方面做到这一点
@Embeddable
public class TicketIdentifier implements Serializable {
String projectId;
Long ticketNum;
public TicketIdentifier() {}
public TicketIdentifier(String projectId) {
this.projectId = projectId;
}
@Column(name = "project", nullable = false, length = 10)
public String getProjectId() {
return projectId;
}
public void setProjectId(String projectId) {
this.projectId = projectId;
}
@GeneratedValue(strategy = GenerationType.SEQUENCE)
@Column(name = "ticket", nullable = false)
public Long getTicketNum() {
return ticketNum;
}
public void setTicketNum(Long ticketNum) {
this.ticketNum = ticketNum;
}
... implementing of hashcode and equals
}
表 DDL
CREATE TABLE support_ticket
(
project VARCHAR(10) NOT NULL,
ticket BIGINT NOT NULL,
... irrelevant stuff
PRIMARY KEY (project, ticket),
CONSTRAINT UK_6qwbkx66syjgp0jcxn16vkqkd
)
但正如您所见,票只是 bigint 而不是看起来更像 bigint auto_increment 不确定我在这里做错了什么。这非常接近我想我想要的。除了票证应该自动递增(如“问题”部分所述),我不知道如何(或者如果这是正确的地方)在项目和票证列组合之间放置破折号。
此外,在下面的屏幕截图中,我也无法做两件事:自动增加 ticket 的值,以及重复使用相同的项目代码。我可以在 DDL 中看到后者是因为项目必须是唯一的,但我希望它只是 唯一的组合。
更新
我能够获得唯一的组合(我认为),但仍然无法按照我想要的方式自动增加 ticket 的值。
任何关于如何在 Java 和/或 Hibernate 组合中执行此操作的建议将不胜感激。提前谢谢你!
【问题讨论】:
-
我认为这可能会对您有所帮助:thoughts-on-java.org/jpa-generate-primary-keys
-
您不希望
ticketNum是唯一的:可以同时存在 PROJ-1 票证和 TICK-1。