gpt4 book ai didi

java - @ManyToOne(updatable=false) - 它应该如何工作?

转载 作者:搜寻专家 更新时间:2023-11-01 03:11:51 25 4
gpt4 key购买 nike

我想在我的一个实体中拥有只读功能。我知道在 JPA 2.0 中我们本身没有这样的功能。我认为我们可以使用 updateable=false, insertable=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();

现在,如果 OrderedItem 实体中没有 @JoinColumn(updatable = false)OrderedItem 将从 PC 中获取,我会访问它的所有者 - Customer - 并成功修改其名称。这不足为奇,因为 Customer 也处于托管状态,因此它必须反射(reflect)在数据库中。

但是,我假设 @JoinColumn 中的 updateable=false 设置在关系的一侧会阻止 UPDATE SQL 语句发生。不幸的是,最后我可以看到数据库中的名字发生了变化(是“Terrence”而不是“John”)。我还可以看到执行的 SQL UPDATE 查询:

[EL Fine]: 2011-11-30 23:41:27.941--ClientSession(16862753)--Connection(11024915)--Thread(Thread[main,5,main])--UPDATE CUSTOMER SET NAME = ? WHERE (ID = ?) bind => [Terrence, 1]

那么 - 这个 updateable=false 到底做了什么?为什么我需要它?它是否只保护我的外键不被更改?这是否类似于“您不能更改实体但可以更改实体的状态”?

最佳答案

来自documentation

Whether the column is included in SQL UPDATE statements generated by the persistence provider.

所以就像你说的,“它只保护我的外键不被更改”

关于java - @ManyToOne(updatable=false) - 它应该如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8334216/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com