- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有三个实体: session 、订单和用户(我的在线电影票项目的一部分)。在我的域模型中,订单保留了用户和 session 的 fk。正如您在我的代码中看到的:
<小时/>@Table(name="Orders")
@Entity
public class Order {
@ManyToOne
@JoinColumn(nullable = false)
private User user;
@ManyToOne
private Session session;
...
}
@Entity
@Table(name="Session")
public class Session {
@OneToMany(fetch=FetchType.LAZY,
cascade = CascadeType.ALL,
mappedBy = "session")
private List<Order> orders = new ArrayList<Order>();
...
}
@Table(name="User")
@Entity
public class User {
@OneToMany(cascade = { CascadeType.PERSIST,
CascadeType.MERGE,
CascadeType.REMOVE },
mappedBy = "user")
private @Getter Set<Order> orders = new HashSet<>();
...
}
<小时/>
我的问题是,我可以在 session 和用户中使用 CascadeType.ALL
吗?使用 session 和用户更新订单时是否存在潜在冲突?
正如你所看到的,我使用了fetchType.Lazy,它能保证Session和User中的订单都是最新的吗?
最佳答案
问题 1:这是一个很好的问题,但为了回答它,您需要了解拥有
实体的概念。带有 @ManyToOne
注释的 Entity
是关系的所有者。这对于开发人员来说很重要,因为除非在拥有方完成,否则任何关系都不会持久,在本例中这意味着设置 Order.user
。但是,由于您在非拥有的 User
上有 cascade
注释,因此您必须做额外的工作才能使用级联功能:
// create Order
Order order = new Order();
// create User and Set of orders
User user = new User();
Set<Order> userOrders = new HashSet<Order>();
user.setOrders(userOrders);
userOrders.add(order);
// and set Order.user
order.setUser(user);
// persist with cascade
em.persist(user);
请注意,您必须创建一组订单并设置 Order.user 以保持级联。但是,如果您将 cascade
注释放在所属实体 Order
上,那么您的工作就会变得更加简单:
// create User
User user = new User();
// create Order
Order order = new Order();
// and set Order.user
order.setUser(user);
// persist with cascade
em.persist(order);
现在,只需保存 order
即可通过一次调用保存新的 User
和 Order
。如果 Order
实体上没有 cascade
注释,则在 User
之前保留 Order
将会出现异常。
引用文献:What is the “owning side” in an ORM mapping? , In a bidirectional JPA OneToMany/ManyToOne association, what is meant by “the inverse side of the association”?
问题2:FetchType.LAZY
意味着您必须通过特定查询来获取子项,所以如果我理解您的问题,答案是否定的,它不能保证任何事情。使用FetchType.LAZY
,当您获得Session
时,当实体分离时,您将无法访问Session.orders
,通常是在您离开您的 session Bean 或服务层。如果您需要访问订单,则需要在选择查询中获取它们:
"select distinct s from Session s join fetch s.orders"
编辑:如前所述,默认情况下此查询执行 SQL“内连接”,如果没有订单,则不会返回任何内容。相反,做
"select distinct s from Session s left join fetch s.orders"
以便您始终获得数据库中的 session 。
引用:Difference between FetchType LAZY and EAGER in Java Persistence API?
关于java - Jpa 几个 @ManyToOne 与 Cascade,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37192657/
当我在注册表上编辑 UID 时,客户表上的 parentid 列应该会更改。它不是那样做的。有什么建议吗? 客户 CREATE TABLE `clients` ( `id` INT(255)
假设我有两个下表: CREATE TABLE post ( id bigint(20) NOT NULL AUTO_INCREMENT, text text , PRIMAR
假设我有两个下表: CREATE TABLE post ( id bigint(20) NOT NULL AUTO_INCREMENT, text text , PRIMAR
TypeORM 中的级联选项是重叠的还是有完全不同的目的?他们在文档中的描述非常稀少,部分缺失,或者我找不到。 IOW,请执行以下选项 { cascade: "update" } = { onUpda
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 2 年前。 Improve
我正在使用 SpringBoot + PostgreSQL + JPA Hibernate,一切似乎都工作正常,但是 Cascade.ALL 属性未应用于表 user_roles。我错过了什么重要的事
我在使用 Doctrine 2 的实体之间的级联关系时遇到了问题。 我有一个与父事件相关的 Media 实体: class Media { /** * @ORM\OneToOne(t
以下是我的示例代码的一部分: public static void main(String[] args) throws Exception { // TODO code applicatio
至少在过去的 6 个小时里我一直在不停地愚弄这个问题,但我就是不明白问题是什么。我在 SpringBoot 项目中设置了两个类(User 和 Item),这两个类之间具有双向关系,如下所示: @One
我已经尝试了我在网上找到的一切,但没有任何东西能让这个或类似的程序在我的电脑上运行。我已经尝试将绝对路径 (C:\opencv\sources\data\haarcascades\haarcascad
我开始安装 vagrant-cascading-hadoop-cluster github项目,但是出现了一些错误,无法结束安装。 当我做“vagrant up”时 sina@linux:/media
我有一个定义如下所示的表关系,我正在尝试从 Entity2(Table2) 级联持久性和删除意味着从 table2 中删除记录应该删除 table3 中的条目并在 table2 中保存数据并将相关数据
我无法在 DELETE CASCADE ON UPDATE CASCADE 上添加外键约束。 我使用两个简单的表格。 TAB1 有 2 列:ID int(10) unsigned NOT NULL A
我的烫金作业被翻译成 9 个 MapReduce 作业(m/r 作业)。对我来说理解每个 m/r 作业代表代码的哪一部分并不容易。有什么可以帮助我更好地了解我的工作吗? //这是从 Tapad 的内部
Cascading Cascading 是 MapReduce 的替代 API,它实际上使用 MapReduce,但允许您以简化的方式编写 MapReduce 代码。 以下示例显示了 Cascad
我有一个关于 Hibernate 的一般性问题,我正在与之抗争。 我有 A 类和 B 类,其中 B 依赖于 A 在我的代码中,当我调用 em.persist(objOfTypeA) 时,我希望插入会插
我有以下实体: @Entity @Table(name = "BOOKS") public class Book { @Id @GeneratedValue(generator = "SE
我正在使用基于 JQuery Cascade plugin ;也许它可以工作,但我发现它有很多问题。 也许有人已经遇到过这个插件,也许可以提供帮助。 所以,我使用这个插件进行位置过滤 http://c
表 DISPLAY_TAB 下面是一个可以包含父选项卡和子选项卡的自引用表。一个父标签可以有多个子标签,一个子标签可以属于多个父标签。 我想在主表和关系表之间建立一个CASCADE DELETE关系
我有一个表 B,它有表 A 的外键,现在我想在 A 上做一些“删除级联”的事情,但 PostgreSQL 不接受以下内容: DELETE FROM ATable WHERE aid IN (
我是一名优秀的程序员,十分优秀!