2017-07-06 63 views
2

我正在使用SpringBoot,Spring數據和postgresql。保存後無法獲取數據庫生成的值

在postgres中,我創建了一個表格。

CREATE EXTENSION "uuid-ossp"; 
CREATE TABLE user (
    id serial PRIMARY KEY not null,   
    user_id varchar(255) not null default uuid_generate_v4() 
); 

不是創建實體

@Entity 
public class User implements Serializable { 

    private static final long serialVersionUID = 9129894781337596497L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(columnDefinition = "serial") 
    private Integer id; 

    @Column(insertable = false) 
    private String userId; 

    public static User create(){ 
    User user = new User(); 
    return user; 
    } 

    public String getUserId(){ 
    return userId; 
    } 

} 

不是創造這樣

@Repository 
public interface UserRepository extends JpaRepository<User, Integer> {} 

JPA庫當我救我需要ID和用戶id的用戶,但我得到空,而不是在數據庫生成UUID。

User user = userRepository.save(User.create()); 
assertThat(user.getUserId()).isNotNull(); 

如何從數據庫中獲取這些生成的值?

+0

主鍵是id不是user_id,你應該檢查assertThat(user.getId())。isNotNull()。 – Mayur

+0

我想獲得userId。即使我保存,之後嘗試使用.findOne(user.getId()),userId,生成的UUID表單數據庫,不會被檢索。 –

+0

如果您像這樣更改表,會發生什麼情況:user_id varchar(255)not null默認'abc'?那樣你會得到'abc'還是null? 'abc'的 – riskop

回答

1

您必須重新讀取插入的實體OR(自Hibernate 3.2?以來),您可以在列(https://docs.jboss.org/hibernate/orm/5.0/topical/html/generated/GeneratedValues.html#_legacy_support_in_database_generation)上指定@Generated(GenerationTime.INSERT),這會導致hibernate在插入後重新讀取屬性值。

我創建了一個小演示:

http://peter.risko.hu/java_incubator/spring_data_postgres_uuid.zip

用戶實體:

@Id 
@SequenceGenerator(name="seq", sequenceName="seq") 
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator="seq") 
@Column(columnDefinition = "serial") 
private Integer id; 

@Column(insertable = false, name="user_id") 
private String userId; 

public String getUserId(){ 
    return userId; 
} 

public static User create(){ 
    User user = new User(); 
    log.info("user created in memory: " + user); 
    return user; 
} 

public Integer getId(){ 
    return id; 
} 

@Override 
public String toString() { 
    return "[id: " + id + ", userId: " + userId + "]"; 
} 

測試:

@Test 
public void testInsert() { 
    User u = userRepository.save(User.create()); 
    log.info("user after save: " + u); 
    log.info("users queried from db: " + userRepository.findAll()); 
} 

輸出:

tst.User - user created in memory: [id: null, userId: null] 
tst.UserRepositoryTest - user after save: [id: 960, userId: null] 
tst.UserRepositoryTest - users queried from db: [[id: 960, userId: dc7cdc53-984d-4051-a3f3-ecc7136d9fd8]] 

如果我申請了@Generated(GenerationTime.INSERT):

@Column(insertable = false, name="user_id") 
@Generated(GenerationTime.INSERT) 
private String userId; 

那麼結果是:

tst.User - user created in memory: [id: null, userId: null] 
tst.UserRepositoryTest - user after save: [id: 961, userId: c68ea300-2f20-47ea-a76d-6e1aaf97a5ea] 
tst.UserRepositoryTest - users queried from db: [[id: 960, userId: dc7cdc53-984d-4051-a3f3-ecc7136d9fd8], [id: 961, userId: c68ea300-2f20-47ea-a76d-6e1aaf97a5ea]] 
0

您應該添加缺少的屬性iduserId getter和setter到User類。

相關問題