2017-06-12 55 views
1

這根本不覺得非常乾燥。如果數據庫已經在SQL腳本中創建,是否需要冗餘的JPA批註?

我有一個SQL腳本可以生成我所有的數據庫表,所以我在我的@Entity類中有很多冗餘註釋。

例如,

@Column(unique = true, length = 254) 
@NotNull 
private String email; 

或自動遞增邏輯,如

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

這些領域的註釋全部是多餘的考慮我已宣佈這些事情的SQL。

是否有任何理由保留這些註釋?據我所知,任何一種嚴重的應用程序都應該使用SQL腳本來創建數據庫表,而且我確信在我正在編寫的類中減少噪音是很好的。

回答

0

兩個原因,我想起:

  1. 當你讓Hibernate創建並且在在測試中使用的內存數據庫中刪除架構他們可以在集成測試非常有用。
  2. 極少數人也都在運行時使用Hibernate做一些optimizations,像optional = false(NOT NULL)與@PrimaryKeyJoinColumn組合爲一個-to-one關聯時,Hibernate知道它是安全的,使延遲關聯代理而不是切換到急切的加載。
1

有兩種類型在你的榜樣註釋(DDL和驗證類型)的:

@Column(unique = true, length = 254) 
@NotNull 
  1. @NotNull是JSR 303 Bean驗證註解。它與數據庫約束本身無關。它由驗證處理器使用,並且不與DB連接。所以它在映射中不是多餘的。 但是,例如

    @Column(可爲空=假) - 它給出JPA提供提示,以產生正確的DDL用於與所述數據庫約束

2. 創建表列@列(unique = true,length = 254)它們是hibernate生成的ddl的提示。

但@Column(更新=假,NAME = 「flight_name」,可爲空=假,長度= 50) 更新 - 這不是DDL,它的優化。

from hibernate docs

@Column(
    ddl/mapping : name="columnName"; 
    optimization: boolean insertable() default true; 
    optimization: boolean updatable() default true; 
    ddl/mapping : String table() default ""; 
    DDL -->: boolean unique() default false; 
    DDL -->: boolean nullable() default true; 
    DDL -->: String columnDefinition() default ""; 
    DDL -->: int length() default 255; 
    ...... 
) 

如果使用DDL腳本所有休眠DDL-註釋屬性是多餘的(如果你在記憶測試中使用,會出現在內存中的分貝autogenaration),並且將只用於如果你配置了hibernate.hbm2ddl。自動選項在休眠/ jpa配置。當你在生產環境中給予hibernate權限來執行DDL時,這也是非常危險的場景。

適用於生產:請參閱liquibaseflywaydb的DDL。

相關問題