2013-01-31 72 views
1

我不知道如何在Hibernate中強制只讀列。如何在Hibernate中設置只讀列?

我想將idgroup設置爲只讀列。即使我設置insertable=falseupdatable=false,在休眠SQL我可以讀:

Hibernate: insert into groups (description, name, account_idaccount, idgroup) values (?, ?, ?, ?) 

,但我想獲得:

insert into groups (description, name, account_idaccount) values (?, ?, ?) 

這裏是我的課:

@Entity 
@Table(name = "groups") 
public class Group implements java.io.Serializable { 

private static final long serialVersionUID = -2948610975819234753L; 
private GroupId id; 
private Account account; 
private String name; 
private String description; 

@EmbeddedId 
@AttributeOverrides({@AttributeOverride(name = "idgroup", column = @Column(name = "idgroup", insertable = false)), 
     @AttributeOverride(name = "accountIdaccount", column = @Column(name = "account_idaccount", nullable = false))}) 
public GroupId getId() { 
    return id; 
} 

@ManyToOne(fetch = FetchType.LAZY) 
@JoinColumn(name = "account_idaccount", nullable = false, insertable = false, updatable = false) 
public Account getAccount() { 
    return account; 
} 

@Column(name = "description", length = 512) 
public String getDescription() { 
    return description; 
} 


@Column(name = "name", nullable = false, length = 128) 
public String getName() { 
    return name; 
} 
.. 
} 
@Embeddable 
public class GroupId implements java.io.Serializable { 

private int idgroup; 
private int accountIdaccount; 

@Column(name = "idgroup", insertable= false, updatable= false) 
public int getIdgroup() { 
    return this.idgroup; 
} 


@Column(name = "account_idaccount", nullable = false) 
public int getAccountIdaccount() { 
    return this.accountIdaccount; 
} 
.. 
} 

我想有一個只讀col因爲我可以利用IDMS自動生成DBMS,所以我不想在Hibernate中使用密鑰自動生成,因爲它不是羣集安全的。

+0

看看http://docs.jboss.org/hibernate/orm/3.5/reference/en-US/html/readonly.html和http://ndpsoftware.com/HibernateMappingCheatSheet.html - 他們可能會給你提示 –

+0

謝謝瑞秋,但第一個鏈接指的是隻讀實體,而我沒有看到第二個對我的案例 – daniele

+0

有用啊。以爲你可以將樂觀鎖設置爲true –

回答

-1

解決方案是使用包裝類,如Integer,而不是原始類型,如int。 當Hibernate將得到一個空指針時,它將委託生成的id到DBMS。

4

我想你可以標記一個@Column標註爲updatable=false

+0

已經完成了,如果你閱讀了GroupId.getIdgroup() – daniele

0

你可以嘗試使現場瞬間,這將是由實體管理器通過@Transient註釋被忽略。

然後,當持久化實體時,該字段將不是查詢的一部分。

+0

以上的代碼並且當我閱讀? – daniele

+0

它不會被包括在內。 –

-2

@ReadOnlyProperty註釋將幫助你在這種情況下。

+0

添加關於*如何幫助的解釋總是有用的。 – Tavo

+0

它沒有幫助我。至少我發現的一個是org.springframework.data.annotation.ReadOnlyProperty。我沒有找到該名稱的Hibernate屬性。 – MiguelMunoz