Java 休眠自动递增ID和复合键
我正在使用hibernate 5.2.4版和postgresql 9.4版,并尝试创建一个带注释的类,该类将帮助我构建如下表:Java 休眠自动递增ID和复合键,java,postgresql,hibernate,Java,Postgresql,Hibernate,我正在使用hibernate 5.2.4版和postgresql 9.4版,并尝试创建一个带注释的类,该类将帮助我构建如下表: ID | client_name | company_name | email ---+-------------+---------------------------- 1 | bob | smith's | 2 | mark | JK warehouse | “ID”中的位置应为自动递增的值,并且
ID | client_name | company_name | email
---+-------------+----------------------------
1 | bob | smith's |
2 | mark | JK warehouse |
“ID”中的位置应为自动递增的值,并且
具有客户端名称和公司名称的复合密钥。组合键未引用任何表
我能够通过@EmbeddedId和@Embeddeble部分实现这一点,如下所示:
@Embeddable
public class ClientId implements Serializable {
@Column(name = "client_name")
private String clientName;
@Column(name = "company_name")
private String companyName;
....
}
Column | Type | Modifiers | Storage
--------------+------------------------+-----------+----------
client_name | character varying(255) | not null | extended
company_name | character varying(255) | not null | extended
email | character varying(255) | | extended
@Entity
@Table(name = "clientdetails")
@IdClass(ClientId.class)
public class ClientDetails {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id", updatable = false, nullable = false)
private Long id;
@Id
@Column (name="client_name")
private String clientName;
@Id
@Column (name="company_name")
private String companyName;
@Column (name="client_email")
private String email;
....
}
client_name | company_name | id | client_email
-------------+--------------+----+-----------------
bob | smith's | | abc@xyz.com
mark | JK warehouse | | abc@xyz.com
(2 rows)
其结果如下表所示:
@Embeddable
public class ClientId implements Serializable {
@Column(name = "client_name")
private String clientName;
@Column(name = "company_name")
private String companyName;
....
}
Column | Type | Modifiers | Storage
--------------+------------------------+-----------+----------
client_name | character varying(255) | not null | extended
company_name | character varying(255) | not null | extended
email | character varying(255) | | extended
@Entity
@Table(name = "clientdetails")
@IdClass(ClientId.class)
public class ClientDetails {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id", updatable = false, nullable = false)
private Long id;
@Id
@Column (name="client_name")
private String clientName;
@Id
@Column (name="company_name")
private String companyName;
@Column (name="client_email")
private String email;
....
}
client_name | company_name | id | client_email
-------------+--------------+----+-----------------
bob | smith's | | abc@xyz.com
mark | JK warehouse | | abc@xyz.com
(2 rows)
但无法合并自动增量ID列。
我还尝试使用@Idclass,但没有成功。我试着在google上搜索,发现了另一个场景,其中要求要么在可嵌入类中包含Id,要么引用其他表,所以最后决定在这里发布帮助
非常感谢
更新:
我使用@IdClass和@GeneratedValue创建了一个复合键,如下所示:
@Embeddable
public class ClientId implements Serializable {
@Column(name = "client_name")
private String clientName;
@Column(name = "company_name")
private String companyName;
....
}
Column | Type | Modifiers | Storage
--------------+------------------------+-----------+----------
client_name | character varying(255) | not null | extended
company_name | character varying(255) | not null | extended
email | character varying(255) | | extended
@Entity
@Table(name = "clientdetails")
@IdClass(ClientId.class)
public class ClientDetails {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id", updatable = false, nullable = false)
private Long id;
@Id
@Column (name="client_name")
private String clientName;
@Id
@Column (name="company_name")
private String companyName;
@Column (name="client_email")
private String email;
....
}
client_name | company_name | id | client_email
-------------+--------------+----+-----------------
bob | smith's | | abc@xyz.com
mark | JK warehouse | | abc@xyz.com
(2 rows)
但这不会自动填充Id值,请帮助尝试以下操作:
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Integer gid;
您还可以尝试将UUID用作标识器。以下是我生成UUID的方法:
@Id
@Column(name = "ETAPA_ID", columnDefinition = "uuid")
@Type(type = "org.hibernate.type.PostgresUUIDType")
@GenericGenerator(name = "uuid2", strategy = "uuid2")
@GeneratedValue(generator = "uuid2")
private UUID id;
试试这个:
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Integer gid;
您还可以尝试将UUID用作标识器。以下是我生成UUID的方法:
@Id
@Column(name = "ETAPA_ID", columnDefinition = "uuid")
@Type(type = "org.hibernate.type.PostgresUUIDType")
@GenericGenerator(name = "uuid2", strategy = "uuid2")
@GeneratedValue(generator = "uuid2")
private UUID id;
请记住,UUID仅在实体保存到数据库中后才分配。建议在postgresql数据库中添加uuid ossp扩展。是否可以将复合ID作为客户端名称和公司名称,并生成ID,即唯一性仅在客户端名称和公司名称上。对于Idclass中的Id、client_name和company_name,唯一性适用于所有3列,并且不会停止创建具有相同client_name和company_name poc=select*from clientdetails的多个条目;ad118f6e | Mark | JK warehouse | 213E43E4 | Mark | JK warehouse |我想我在这里找到了我要找的东西[link]请记住,UUID只有在实体保存到db中之后才被分配。建议在postgresql数据库中添加uuid ossp扩展。是否可以将复合ID作为客户端名称和公司名称,并生成ID,即唯一性仅在客户端名称和公司名称上。对于Idclass中的Id、client_name和company_name,唯一性适用于所有3列,并且不会停止创建具有相同client_name和company_name poc=select*from clientdetails的多个条目;ad118f6e | Mark | JK warehouse | 213E43E4 | Mark | JK warehouse |我想我找到了我要找的东西[链接]