Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Jpa多个@manytone带级联_Java_Spring_Hibernate_Jpa_Cascade - Fatal编程技术网

Java Jpa多个@manytone带级联

Java Jpa多个@manytone带级联,java,spring,hibernate,jpa,cascade,Java,Spring,Hibernate,Jpa,Cascade,我有三个实体,会话、订单和用户(我的在线电影票项目的一部分)。在我的域模型中,Order保持用户和会话的fk。正如您在我的代码中所看到的: @Table(name=“Orders”) @实体 公共阶级秩序{ @许多酮 @JoinColumn(nullable=false) 私人用户; @许多酮 非公开会议; ... } @实体 @表(name=“Session”) 公开课{ @OneToMany(fetch=FetchType.LAZY, cascade=CascadeType.ALL, ma

我有三个实体,会话、订单和用户(我的在线电影票项目的一部分)。在我的域模型中,Order保持用户和会话的fk。正如您在我的代码中所看到的:


@Table(name=“Orders”)
@实体
公共阶级秩序{
@许多酮
@JoinColumn(nullable=false)
私人用户;
@许多酮
非公开会议;
...
}
@实体
@表(name=“Session”)
公开课{
@OneToMany(fetch=FetchType.LAZY,
cascade=CascadeType.ALL,
mappedBy=“会话”)
私有列表顺序=新的ArrayList();
...
}
@表(name=“User”)
@实体
公共类用户{
@OneToMany(cascade={CascadeType.PERSIST,
CascadeType.MERGE,
CascadeType.REMOVE},
mappedBy=“用户”)
private@Getter Set orders=new HashSet();
...
}

我的问题是,我可以在会话和用户中使用
CascadeType.ALL
? 会话和用户更新顺序时是否存在潜在冲突



如您所见,我使用fetchType.Lazy,它能保证会话和用户中的订单都是最新的吗

问题1:这是一个很好的问题,但要回答它,你需要理解
拥有的
实体的概念。带有
@ManyToOne
注释的
实体
是关系的所有者。这对开发人员来说很重要,因为除非在拥有方完成,否则不会保持任何关系,在这种情况下,这意味着设置
Order.user
。但是,由于您在非拥有的
用户
上有
级联
注释,因此您必须进行额外的工作才能使用级联功能:

// 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
即可通过一次调用持续执行新的
用户和
订单。如果在
Order
实体上没有
cascade
注释,则在
User
之前持久保存
Order
将导致异常

参考文献:

问题2:
FetchType.LAZY
意味着你必须通过特定的查询来获取子项,因此如果我理解你的问题,答案是否定的,这不能保证任何事情。使用
FetchType.LAZY
当您获得
会话时,您将无法访问
会话。当实体分离时,通常是在您离开会话Bean或服务层之后,订单将无法访问。如果您需要访问订单,则需要在选择查询中获取订单:


“从会话s中选择不同的s加入获取s订单”

编辑:如前所述,默认情况下,此查询执行sql“内部联接”,如果没有订单,则不会返回任何结果。相反,你应该这样做


“从会话的左连接获取s订单中选择不同的s”

这样您就可以始终获得数据库中的会话


参考资料:

谢谢,正是我要找的!“select distinct s from Session s join fetch s.orders”,但如果s.orders为空,此查询将返回null。如果数据库中已经有空订单的会话,如何向其中插入订单?
// 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);
// 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);