2017-04-07 86 views
0

假設有這樣一個類:hibernate用未映射的列做什麼?

public class Entity { 
    private Long id; 
    private String name; 
} 

和表3列:ID,姓名和地址。

CREATE TABLE entity (
    id NUMBER(9,0), 
    name VARCHAR2(255), 
    address VARCHAR2(1000), 

然後進行連接插入:

INSERT INTO entity (id, name, address) VALUES (1, "a", "b") 

然後我們加載和更新休眠實體:

Session session = ... 
Entity entity = session.get(Entity.class, 1); 

然後更新名稱,並重新保存:

entity.setName("newName"); 
session.save(entity); 

那麼什麼是地址欄現在的價值 - null或b?休眠是否爲這種情況提供了一些策略,或者我必須 將address字段添加到實體中並將其標記爲@Column(updatable=false, insertable = false)

+0

如果它沒有被映射,那麼它被忽略。地址值將是相同的「b」。 – owenrb

+3

@Cherry你嘗試過嗎? – niksofteng

回答

1

如果你會把persistence.xml中的下列屬性(或者您已經定義了Hibernate屬性)

<property name="hibernate.show_sql" value="false"/> 
<property name="hibernate.format_sql" value="false"/> 

然後,你可以看到Hibernate執行查詢時,服務器與記錄的調試模式運行配置爲調試。

如果實體是

public class Entity { 
    private Long id; 
    private String name; 
    private String secondName; 
    //Getters & Setters 
} 

然後執行以下HQL

SELECT e FROM Entity e WHERE e.id = 121 

會產生類似的結果

SELECT entity0_.id  AS id1_63_, 
     entity0_.name  AS name6_63_, 
     entity0_.secondName AS secondName6_63_, 
FROM yout_db.Entity entity0_ 
WHERE entity0_.id = 121 

你看,這裏SELECT * FROM Entity沒有執行,而不是所有的字段從該類被提取並添加到查詢中。所以如果你忽略了數據庫中的任何字段,那麼它將不會參與查詢。

對於選擇更新也發生同樣的事情。

entity.setName("newName"); 
session.save(entity); 

下面是格式化的查詢,如果你將更新實體:

UPDATE your_db.Entity 
SET name = ? 
     secondName = ? 
WHERE id = ? 

即使只有一個字段被改變時,這個查詢將被執行。

0

Hibernate只能使用從實體獲取的列,基於屬性名稱或在註釋中描述。所以在你的情況下,'地址'的值是'b'。

+0

你能否請證明與dicunentation鏈接? – Cherry