2011-11-30 79 views
4

我想在我的一個實體中擁有只讀功能。我知道在JPA 2.0中,我們本身沒有這樣的功能。我認爲我們可以使用updateable=false, insertable=false來實現它,但我不認爲我知道它是如何工作的。@ManyToOne(updatable = false) - 它應該如何工作?

假設我有兩個實體:OrderedItemCustomer

@Entity 
public class OrderedItem { 

    @Id 
    @GeneratedValue 
    private int id; 

    private String name; 

    @ManyToOne 
    @JoinColumn(updatable = false) 
    private Customer owner; 

    // bunch of simple getters and setters 
} 

@Entity 
public class Customer { 

    @Id 
    @GeneratedValue 
    private int id; 

    private String name; 

    @OneToMany(mappedBy="owner") 
    private Set<OrderedItem> orderedItems; 

    // bunch of simple getters and setters 
} 

現在考慮下面的代碼:

Customer john = new Customer(); 
john.setName("John"); 

OrderedItem milk = new OrderedItem(); 
milk.setName("Milk"); 
milk.setOwner(john); 

Set<OrderedItem> items = new HashSet<OrderedItem>(); 
items.add(milk);   
john.setOrderedItems(items); 

// This starts the EM transaction 
startTx(); 

em.persist(john); 
em.persist(milk); 

stopTx(); 

startTx(); 

OrderedItem milkFromPC = em.find(OrderedItem.class, milk.getId()); 

System.out.println(milkFromPC.getName() + " ordered by customer: " + 
        milkFromPC.getOwner().getName()); 

// Changing the state of Owner entity through the OrderedItem 
milkFromPC.getOwner().setName("Terrence"); 

stopTx(); 

現在,沒有@JoinColumn(updatable = false)OrderedItem實體,該OrderedItem將從中獲取PC,我可以訪問它的所有者 - 一個Customer - 並且會成功修改它的名字。這並不令人意外,因爲Customer也處於託管狀態,所以它必須反映在數據庫中。

然而,我認爲updateable=false@JoinColumn集上的關係的一個側面將防止UPDATE SQL語句的發生。不幸的是在最後我可以看到數據庫(這是「泰倫斯」,​​而不是「約翰」)更改的名稱。我還可以看到執行的SQL UPDATE查詢:

[EL精細]:2011-11-30 23:41:27.941 - ClientSession的(16862753) - 連接(11024915) - 線程(線程[ main,5,main]) - UPDATE CUSTOMER SET NAME =? WHERE(ID =?)bind => [Terrence,1]

那麼 - 這個updateable=false真的在做什麼?我爲什麼需要它?它是否只保護我的外鍵不被更改?它是否像'你不能改變實體,但你可以改變實體的狀態'?

回答

3

documentation

列是否包含在持久性提供生成的SQL UPDATE語句。

所以就像你說的,「它保護被改變只是我的外鍵」

+0

謝謝您的回答。這將符合我的經驗。但是,在第288頁的「專業版JPA 2掌握Java持久性API」*中,有一個「updateable = false,insertable = false」的示例,並且存在以下注釋:*「沒有新實體將被保留,並且現有的實體永遠不會被更新「。*它們嚴格地指」實體「......不知道該怎麼想:-) –

相關問題