2016-04-29 111 views
1

我有一個名爲Author的實體,如下所示。我想在字段「name」上添加一個唯一的約束。如何在JHipster中爲實體添加唯一約束?

@Entity 
@Table(name = "author") 
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) 
@Document(indexName = "author") 
public class Author implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

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


    @Column(name = "birth_date") 
    private LocalDate birthDate; 

回答

3

來產生實體領域唯一的選項的JHipster發生器所缺乏的。要手動做到這一點:

  1. 生成實體
  2. 添加唯一約束在liquibase的changelog XML(http://www.liquibase.org/documentation/changes/add_unique_constraint.html
  3. 添加獨特= true參數來@Column註釋(https://docs.jboss.org/hibernate/jpa/2.1/api/javax/persistence/Column.html

。我只在MySQL和PostgreSQL中測試過,我確實記得曾經在某處讀過,這對某些NoSQL數據庫不起作用。這也可能是它沒有被包含在JHipster中的原因。但不要引用我的話。

+0

它不包含在JHipster中,因爲該功能也需要添加到前端,這意味着每次驗證都會向服務器進行往返需要發生。見https://github.com/jhipster/generator-jhipster/issues/2199 – geraldhumphries

+1

我很抱歉沒有把這當做阻塞問題。在發佈到端點時,它只會響應4xx,然後UI會通知用戶有關問題(jhi-alert)。這種行爲在嘗試使用時已經內置於jhipster中 - 例如,當嘗試使用已存在的電子郵件進行註冊時。 –

2

當我做了上述,它的工作,但是當我嘗試添加重複項,我得到了錯誤:客戶端的內部服務器錯誤。這是太一般的錯誤,我想定製它。所以,我做了以下內容:

1)編輯myapp.web.rest.errors.ErrorConstants.java,並將此行添加新的錯誤常數:編輯myapp.web.rest

public static final String ERR_VALIDATION_DUPLICATE = "entity.validation.duplicate"; 

2) .errors.ExceptionTranslator.java加入我的錯誤翻譯

@ExceptionHandler(DataIntegrityViolationException.class) 
    @ResponseBody 
    @ResponseStatus(HttpStatus.CONFLICT) 
    public ErrorVM processDataIntegrityViolationException(DataIntegrityViolationException exception) { 
     return new ErrorVM(ErrorConstants.ERR_VALIDATION_DUPLICATE, exception.getMessage()); 
    } 

3)編輯後的src /主/ web應用/國際化/ EN/global.json並添加

"entity": { 
... 
     "validation": { 
... 
      "duplicate": "This value is duplicate to existing data.", 
... 
} 

以匹配由服務器端的錯誤映射生成的密鑰。 您需要添加相同的文本消息,但翻譯爲支持的所有語言。

注: 如果你想在驗證異常更具體的,您可以創建擴展DataIntegrityViolationException自己的特殊例外,那麼趕上通用DataIntegrityViolationException在資源類,並把你的新的異常。並且當然可以將其映射爲1,2和3中的完成。