2016-03-04 11 views
0

我有一個實體如下(Getter和Setter被忽略)。當id爲空時自動增加,但在id爲hibernate時不爲空時應用指定的值?

@Entity 
@Table(name = "users") 
public class User implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @GenericGenerator(name = "idGenerator", strategy = "increment") 
    @Id 
    @GeneratedValue(generator = "idGenerator") 
    @Column(name = "id", updatable = false, unique = true, nullable = false) 
    private Integer id; 

    @Column(name = "name") 
    private String name; 
} 

我需要的是:
1)ID == NULL(ID未分配),該策略是自動遞增
2)ID = NULL(ID分配),堅持實體與分配的值

對於我的代碼,id生成將自動增量隨時。我想知道是否hibernate可以通過配置支持上述要求?或者我需要手動實現它?我正在使用的數據庫是MySql。

在此先感謝。

回答

2

你描述的auto increment column

AUTO_INCREMENT屬性可以用來生成新行的唯一身份......

CREATE TABLE animals (
    id MEDIUMINT NOT NULL AUTO_INCREMENT, 
    name CHAR(30) NOT NULL, 
    PRIMARY KEY (id) 
); 

INSERT INTO animals (name) VALUES 
    ('dog'),('cat'),('penguin'), 
    ('lax'),('whale'),('ostrich'); 

SELECT * FROM animals; 

將返回:

 
+----+---------+ 
| id | name | 
+----+---------+ 
| 1 | dog  | 
| 2 | cat  | 
| 3 | penguin | 
| 4 | lax  | 
| 5 | whale | 
| 6 | ostrich | 
+----+---------+ 

沒有爲AUTO_INCREMENT列指定值,所以MySQL會自動分配序列號。您也可以明確地將0賦給列以生成序列號。如果該列被聲明爲NOT NULL,那麼也可以將NULL分配給該列以生成序列號。將任何其他值插入AUTO_INCREMENT列時,該列將設置爲該值,並重置序列,以便下一個自動生成的值從最大列值開始依次跟隨。

+0

是的,我表中的id字段已經設置爲'AUTO_INCREMENT',我可以得到你在原生SQL中所說的。然而,如果我在註釋hibernate中刪除了生成策略,我會得到Exception消息,在調用save()之前必須手動分配這個類的id,是否有更多的建議? – Junjie

+0

@Junjie:快速搜索表明相關的Hibernate註釋是'@GeneratedValue(strategy = GenerationType.AUTO)'。 –

+0

設置「@GeneratedValue(strategy = GenerationType.AUTO)」時會發生意外的異常,但可與'@GeneratedValue(strategy = GenerationType.IDENTITY)'一起使用。非常感謝您節省時間。 – Junjie