我尝试实现简单的一对多关联。在使用调试模式检查item对象后,我发现已经加载了list
@Entity @Table(name = "ITEM") public class Item implements Serializable { @Id private Long id = null; private String name; @ManyToOne(fetch = FetchType.EAGER) @JoinColumn(name = "SELLER_ID", nullable = false) private User seller; @OneToMany(mappedBy = "item", fetch = FetchType.LAZY) private List<Bid> bids; /** * No-arg constructor for JavaBean tools. */ public Item() {} public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public User getSeller() { return seller; } public void setSeller(User seller) { this.seller = seller; } @Override public String toString() { return "Item{" + "id=" + id + ", name='" + name + '\'' + ", seller=" + seller + ", bids=" + bids + '}'; } }
@Entity @Table(name = "BID") public class Bid implements Serializable { @Id @GeneratedValue @Column(name = "BID_ID") private Long id = null; @ManyToOne @JoinColumn(name = "ITEM_ID", nullable = false, updatable = false, insertable = false) private Item item; @ManyToOne @JoinColumn(name = "BIDDER_ID", nullable = false, updatable = false) private User bidder; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public Item getItem() { return item; } public void setItem(Item item) { this.item = item; } public User getBidder() { return bidder; } public void setBidder(User bidder) { this.bidder = bidder; } @Override public String toString() { return "Bid{" + "id=" + id + ", bidder=" + bidder + '}'; } }
private static void itemSeller(EntityManager em) { Item item = em.find(Item.class, 1L); System.out.println("hello"); }
Hibernate docs@OneTomany--默认fetchType是LAZY@ManyToOne--默认fetchType是eager。
如果要更改,则fetch=fetchType.lazy/eager
基本上,有两次hibernate对象(1)实体对象(2)值对象(2)。所以在您的情况下,Item与Bid有对多的关系,如果您当时检索Item类,hibernate将不会获取相关的Bid类记录,因为您确实获取类型是懒惰的,但是您获取Bid类记录hibernate为您获取相关的Item,因为Bid与Item类有ManyToOne关系,并且ManyToOne的默认获取类型是Eager。
通过在调试器中检查对象,您要求它调用列表的方法来显示其大小、内容等,这当然会懒洋洋地初始化列表。
您的toString()
方法也是如此,它隐含地在列表中循环以打印它。
我见过几个类似的问题有0个好答案。 这应该非常简单。我正在使用 Java JPA,有时想要加载子实体列表,但不是所有时间。不幸的是,当我说要懒惰地获取它时,JPA似乎没有听我的话。我已经 100% 确定在我的代码中没有任何地方以任何方式访问 childEntities 属性。但是,在我的 JPA.em(.)查找(.)调用时,所有子实体仍然会立即加载。这就是我如何声明与注释的关系。 我是这样加载父实
我通过提示检查了它在EclipseLink中的工作情况: 这个链接http://blog.ringerc.id.au/2012/06/jpa2-is-very-inflexible-with-eagerlazy.html暗示通过Hibernate是不可能的,建议手动获取。但是,我无法理解如何通过HQL或标准来实现它,特别是如何获得不在实体上但仅存在于数据库上的child.parent_id列。即避
我无法通过下面的示例了解如何快速加载。这是我当前的数据库,有两个表,Quotes:存储一般信息的地方,QuotesDetails:存储Quotes中每个Quote的详细信息的地方。 在模型中,我有以下结构: 引用。php QuotesDetails.php以下型号: 我使用了hasMany(引号中),因为每个引号可以有/显示3-4个quotesdetails。 在我的控制器中,我使用以下查询: 在
即使我的流不是空的,回退流总是会被创建?这样做背后的意图是什么?这是极不地道的。
考虑下面的API方法,它取自Shiro的接口,但也可能存在于其他库中: 是的,即使是现在,仍然有库使用原始类型,可能是为了保持Java 1.5之前的兼容性?! 如果我现在想将此方法与流或选项一起使用,如下所示: 我收到一条关于未经检查的转换和使用原始类型的警告,我更喜欢使用参数化类型。 日食: 类型安全:收集(Collector)方法属于原始类型Stream javac: 注意:GenericsT
问题内容: 我有这样的实体: 还有一个: 使用Criteria API,我想获得带有过滤的Picturs集的唯一AlbumD。我尝试这样的事情: 在这里,我得到了带有所有关联图片的相册。它们根本没有被过滤。当我尝试执行记录器打印的查询时,只有给定eventId的图片数量只有四行,但是在“相册”中,我获取了所有图片。 我也尝试了其他ResultTransformers,但最终得到了很多结果(4),但