我想在不加载整个对象的情况下获取一对一关系的id.我以为我可以使用延迟加载执行此操作,如下所示:
class Foo {
@OneToOne(fetch = FetchType.LAZY, optional = false)
private Bar bar;
}
Foo f = session.get(Foo.class, fooId); // Hibernate fetches Foo
f.getBar(); // Hibernate fetches full Bar object
f.getBar().getId(); // No further fetch, returns id
Run Code Online (Sandbox Code Playgroud)
我希望f.getBar()不会触发另一个提取.我希望hibernate给我一个代理对象,允许我调用.getId()而不实际获取Bar对象.
我究竟做错了什么?
我有两个数据库实体:Forum和Topic.
Topic有protected long forumId数据成员,当然表示Topic论坛.
我的问题是这个数据成员使用的注释是什么?
我有Employee(父母)和Emp_Contacts(孩子).只有Employee类具有单向映射.
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.validation.constraints.Digits;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import org.hibernate.validator.constraints.NotEmpty;
@Entity
@Table(name="EMPLOYEE")
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Size(min=3, max=50)
@Column(name = "NAME", nullable = false)
private String name;
...
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "emp_id")
private Set<Emp_Contacts> contacts;
...getters and setters...
Run Code Online (Sandbox Code Playgroud)
我的Emp_Contacts情况如下:
@Entity
@Table(name = "Emp_Contacts") …Run Code Online (Sandbox Code Playgroud) 我在使用 hibernate 时遇到了性能问题。我有以下几点:
@Data
@Entity
@Table(name="\"Order_product\"")
public class OrderProduct {
@Id
@SequenceGenerator(name="Order_product_id_seq",
sequenceName="Order_product_id_seq",
allocationSize=1)
@GeneratedValue(strategy = GenerationType.SEQUENCE,
generator="Order_product_id_seq")
private long id;
@ManyToOne
@NotNull
private Product product;
@ManyToOne
@NotNull
private ProductPrice price;
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@NotNull
private Order order;
}
Run Code Online (Sandbox Code Playgroud)
现在,每当我尝试执行:
List<OrderProduct> findByOrderId(@Param(value = "order") Long orderId);
Run Code Online (Sandbox Code Playgroud)
Hibernate 将为每个 OrderProduct 加载整个 Order。如何禁用此功能,以便仅加载订单 ID?
LazyInitializationException当我尝试访问分离实体的惰性 @ManyToOne 引用的 ID 时,我正面临着这种情况。我不想完全获取引用,而只需要 ID(它应该存在于原始对象中,以便以惰性/延迟方式获取引用)。
EntityA ea = dao.find(1) // find is @Transactional, but transaction is closed after method exits
ea.getLazyReference().getId() // here is get exception. lazyReference is a ManyToOne relation and so the foreight key is stored in EntityA side.
Run Code Online (Sandbox Code Playgroud)
换句话说,如何在不实际获取整个 LazyReference 的情况下访问 LazyReference 的 ID(实际上存在于 EntityA 的初始选择中)?
java ×5
hibernate ×4
jpa ×2
annotations ×1
foreign-keys ×1
lazy-loading ×1
many-to-one ×1
mysql ×1
orm ×1
spring-mvc ×1