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

我想在我的一个实体中拥有只读功能.我知道在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 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 items = new HashSet();

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获取,我将访问它的所有者 – 客户 – 并且会成功修改其名称.这并不奇怪,因为客户也处于托管状态,因此必须反映在数据库中.

但是,我假设在关系的One侧设置的@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真的有用吗?我为什么需要它?它只保护我的外键不被改变吗?它是否像’你不能改变实体但你可以改变实体的状态’?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
@Data @AllArgsConstructor @NoArgsConstructor @Builder @Table(name = "advert") public class Advert { /** * 主键 */ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @ApiModelProperty(value = "广告唯一id") private Integer id; /** * 广告名称 */ @ApiModelProperty(value = "广告名称") @NotBlank(message = "广告名称不可为空", groups = {AddGroup.class, UpdateGroup.class}) private String name; /** * 广告位置ID */ @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "position_id") private AdPosition position; /** * 广告图片ID */ @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "media_id") private MediaFile media; /** * 开始日期 */ @Column(name = "start_date") @ApiModelProperty(value = "开始日期") @NotNull(message = "开始日期不可为空", groups = {AddGroup.class}) private Date startDate; /** * 结束日期 */ @Column(name = "end_date") @ApiModelProperty(value = "结束日期") @NotNull(message = "结束日期不可为空", groups = {AddGroup.class}) private Date endDate; /** * 广告链接 */ @ApiModelProperty(value = "广告链接") @NotBlank(message = "广告链接不可为空", groups = {AddGroup.class}) private String link; /** * 广告状态:0:未启用,1:已启用,2:已结束 */ @ApiModelProperty(value = "广告状态") @NotNull(message = "广告状态不可为空", groups = {UpdateGroup.class}) private Integer status; /** * 创建时间 */ @Column(name = "create_time") @ApiModelProperty(value = "创建时间") private Date createTime; /** * 更新时间 */ @Column(name = "update_time") @ApiModelProperty(value = "更新时间") private Date updateTime; },这个类进行添加和修改时,因为有大量重复代码,如何简化代码并避免并发问题
最新发布
06-01

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值