Pio*_*cki 5 java readonly eclipselink java-ee-6 jpa-2.0
我想在我的一个实体中拥有只读功能。我知道在 JPA 2.0 中我们本身没有这样的功能。我认为我们可以使用它来实现它updateable=false, insertable=false,但我不认为我明白它是如何工作的。
假设我有两个实体:OrderedItem和Customer:
@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
}
Run Code Online (Sandbox Code Playgroud)
现在考虑以下代码:
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();
Run Code Online (Sandbox Code Playgroud)
现在,如果没有@JoinColumn(updatable = false)实体OrderedItem,OrderedItem将从 PC 中获取该文件,我将访问它的所有者 - a Customer- 并成功修改其名称。这并不奇怪,因为它Customer也处于托管状态,因此它必须反映在数据库中。
然而,我假设关系一侧的updateable=falsein set 会阻止 UPDATE SQL 语句的发生。@JoinColumn不幸的是,最后我可以看到数据库中的名称发生了变化(它是“Terrence”而不是“John”)。我还可以看到执行的 SQL UPDATE 查询:
[EL Fine]: 2011-11-30 23:41:27.941--ClientSession(16862753)--Connection(11024915)--Thread(Thread[main,5,main])--更新客户集名称 = ?WHERE (ID = ?) 绑定 => [Terrence, 1]
那么 - 这updateable=false到底有什么作用呢?为什么我需要它?它是否只保护我的外键不被更改?是不是就像“你不能改变实体,但你可以改变实体的状态”?
| 归档时间: |
|
| 查看次数: |
8963 次 |
| 最近记录: |