您现在的位置是:主页 > news > b2b电子商务交易平台有哪些/seo查询是什么意思
b2b电子商务交易平台有哪些/seo查询是什么意思
admin2025/6/13 4:44:49【news】
简介b2b电子商务交易平台有哪些,seo查询是什么意思,网站建设机构,山东建设监理协会官方网站今天做练习的遇到了一个问题,下面重现一下错误的场景: 下面是一个Base pojo,里面包含有多个Item pojo。这里我想要在查询base的时候可以把所有的item都查出来。 所以这里使用FetchTypeEAGER,会立即引起相关联实体的加载动作&…
今天做练习的遇到了一个问题,下面重现一下错误的场景:
下面是一个Base pojo,里面包含有多个Item pojo。这里我想要在查询base的时候可以把所有的item都查出来。
所以这里使用FetchType=EAGER,会立即引起相关联实体的加载动作,就是为了能够及时抓取所有的Item。
如果使用FetchType=LAZY,就会加载不到Base的所有Iteam。
import org.hibernate.annotations.GenericGenerator;import javax.persistence.*;
import java.util.HashSet;
import java.util.Set;@Entity
@Table(name="Bases")
public class Base {@Id@GenericGenerator(strategy="uuid",name="uuid")@GeneratedValue(generator = "uuid")private String id;private String baseName;@OneToMany(mappedBy = "base",cascade = CascadeType.ALL,fetch = FetchType.EAGER)private Set<Item> items = new HashSet<Item>();public Base(){}public String getId() {return id;}public void setId(String id) {this.id = id;}public Set<Item> getItems() {return items;}public void setItems(Set<Item> items) {this.items = items;}public String getBaseName() {return baseName;}public void setBaseName(String baseName) {this.baseName = baseName;}
}
import org.hibernate.annotations.GenericGenerator;import javax.persistence.*;@Entity
@Table(name = "Items")
public class Item {@Id@GenericGenerator(strategy="uuid",name="uuid")@GeneratedValue(generator = "uuid")private String id;private String itemName;private Integer itemNum;@ManyToOne@JoinColumn(name="b_id")private Base base;public Base getBase() {return base;}public void setBase(Base base) {this.base = base;}public Item(){}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getItemName() {return itemName;}public void setItemName(String itemName) {this.itemName = itemName;}public Integer getItemNum() {return itemNum;}public void setItemNum(Integer itemNum) {this.itemNum = itemNum;}
}
结果在测试删除item的时候,发现无法删除。但是在删除base的时候是可以级联删除掉item的,而在删除item的时候,控制台只打印出两次select语句,并没有执行删除操作。。
@Testpublic void deleteItem(){ItemServiceImpl itemService = context.getBean(ItemServiceImpl.class);String id = "8a5e9d4464f06f6b0164f06f6d950002";String deleteId = itemService.deleteItem(id);Assert.assertTrue(deleteId.equals(id));}
下面是service层:
@Transactional@Overridepublic String deleteItem(String id) {return itemDao.deleteItem(id);}
下面是dao层:
@Overridepublic String deleteItem(String id) {Item item = em.getReference(Item.class, id);em.remove(item);return id;}
结果最后控制台只打印了两次select语句:
Hibernate: select item0_.id as id1_1_0_, item0_.b_id as b_id4_1_0_, item0_.itemName as itemName2_1_0_, item0_.itemNum as itemNum3_1_0_, base1_.id as id1_0_1_, base1_.baseName as baseName2_0_1_ from Items item0_, Bases base1_ where item0_.b_id=base1_.id(+) and item0_.id=?Hibernate: select items0_.b_id as b_id4_1_0_, items0_.id as id1_1_0_, items0_.id as id1_1_1_, items0_.b_id as b_id4_1_1_, items0_.itemName as itemName2_1_1_, items0_.itemNum as itemNum3_1_1_ from Items items0_ where items0_.b_id=?
之所以打印出两次select语句,是因为@ManyToOne的FetchType默认是FetchType.EAGER
@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ManyToOne {Class targetEntity() default void.class;CascadeType[] cascade() default {};FetchType fetch() default FetchType.EAGER;boolean optional() default true;
}
所以在dao层中Item item = em.getReference(Item.class, id);,查询item的时候,就会加载关联的base的数据。
而@OneToMany的FetchType默认是FetchType.LAZY
@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface OneToMany {Class targetEntity() default void.class;CascadeType[] cascade() default {};FetchType fetch() default FetchType.LAZY;String mappedBy() default "";boolean orphanRemoval() default false;
}
解决方法:将@oneToMany中的fetch=FetchType.EAGER注释掉就可了。
但是我就是想要及时加载所有的Item数据,这种时候该怎么解决,后来尝试了很多方式,总于找到解决方法
解决方法就是把@ManyToOne的FetchType设置为FetchType.LAZY
@Entity
@Table(name = "Items")
public class Item {@Id@GenericGenerator(strategy="uuid",name="uuid")@GeneratedValue(generator = "uuid")private String id;private String itemName;private Integer itemNum;@ManyToOne(fetch = FetchType.LAZY)//加上LAZY@JoinColumn(name="b_id")private Base base;public Base getBase() {return base;}public void setBase(Base base) {this.base = base;}public Item(){}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getItemName() {return itemName;}public void setItemName(String itemName) {this.itemName = itemName;}public Integer getItemNum() {return itemNum;}public void setItemNum(Integer itemNum) {this.itemNum = itemNum;}
}
测试:
Hibernate: select item0_.id as id1_1_0_, item0_.b_id as b_id4_1_0_, item0_.itemName as itemName2_1_0_, item0_.itemNum as itemNum3_1_0_ from Items item0_ where item0_.id=?
Hibernate: delete from Items where id=?
虽然经过很多尝试找到解决方法,但是还是不太明白为什么会使用FetchType.EAGER就导致无法删除,再慢慢研究吧,研究出来以后会贴出来,也希望有人可以解答我的疑惑。。