Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 休眠自动递增ID和复合键_Java_Postgresql_Hibernate - Fatal编程技术网

Java 休眠自动递增ID和复合键

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”中的位置应为自动递增的值,并且

我正在使用hibernate 5.2.4版和postgresql 9.4版,并尝试创建一个带注释的类,该类将帮助我构建如下表:

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 |我想我找到了我要找的东西[链接]