相关疑难解决方法(0)

什么是懒惰加载?

什么是懒惰加载?

[阅读几个答案后编辑]为什么人们经常使用这个术语?

假设您只使用ASP/ADO记录集并将其加载数据或ADO.NET数据源以用于gridview.

我想我应该问为什么人们使用"懒惰加载"一词,"其他"类型是什么?

data-binding lazy-loading

89
推荐指数
6
解决办法
7万
查看次数

Hibernate代理对象包含什么?

我可以从谷歌收集的是:

  • Hibernate使用代理对象来实现延迟加载.当我们请求从数据库加载Object,并且获取的Object具有对另一个具体对象的引用时,Hibernate返回代理而不是具体的关联对象.

  • Hibernate使用字节码检测(由javassist提供)创建代理对象.Hibernate在运行时使用代码生成库创建实体类的子类,并用新创建的代理替换实际对象.

那么,Proxy对象到底包含什么?

它是否包含仅设置了id字段的骨架对象引用对象?我们调用get方法时会设置其他字段吗?

Proxy对象是否包含JDBC语句以获取完全填充引用对象所需的所有数据.

还有什么我可能会失踪的吗?

我不是要求勺子喂食,但如果你能提供任何链接信息很棒.

对上述说明的任何更正也将受到欢迎.

例.

class Address {
   String city;
   String country;
}

class Person{
   int id;
   String name;
   Address address;
}    
Run Code Online (Sandbox Code Playgroud)

当我们尝试加载Person对象时,Hibernate会将Person类子类化为:

class ProxyPerson extends Person {
       int id;
       String name;
       Address proxyCGLIBObject;
}
Run Code Online (Sandbox Code Playgroud)

并返回一个ProxyPerson对象.ProxyPerson的对象将具有id和name的值,但是Address的代理.

我对么?

在代理对象上添加toString()方法可以期待什么?

java orm proxy hibernate hibernate-mapping

43
推荐指数
1
解决办法
2万
查看次数

JPA和Hibernate中N + 1问题的解决方案是什么?

我知道N + 1问题是执行一个查询以获取N个记录和N个查询以获取某些关系记录.

但是如何在Hibernate中避免它呢?

java orm design-patterns hibernate jpa

31
推荐指数
6
解决办法
4万
查看次数

Javassist进行.什么是主要想法和实际使用的地方?

我知道Javassist是一个Java库,它提供了一种操作应用程序Java字节码的方法.

好的,但为什么我们需要操作字节码?

任何真实的例子?任何真正的应用程序,javassist使用?

java bytecode javassist

30
推荐指数
2
解决办法
1万
查看次数

具有连接表的双向一对多

我在使用JoinTables进行双向一对多关联时遇到了一些问题.这就是我得到的:

A类:

@OneToMany
@JoinTable(name="join_table", 
    JoinColumns={@JoinColumn(name="a_id")},
    inverseJoinColumns={@JoinColumn(name="b_id")}
)
@Cascade(org.hibernate.annotations.CascadeType.ALL)
public Set<B> getBs() {
    return bs;
}
Run Code Online (Sandbox Code Playgroud)

B级:

@ManyToOne
@JoinTable(name="join_table", 
    joinColumns={@JoinColumn(name="b_id", insertable=false,updatable=false)},
    inverseJoinColumns={@JoinColumn(name="a_id", insertable=false,updatable=false)})
public A getA() {
    return a;
}
Run Code Online (Sandbox Code Playgroud)

如果我创建了A和B的实例,请将B的实例添加到A并保存.有用.但是当我重新加载A的实例并尝试访问B组时,它会抛出一个带有"非法访问加载集合"消息的LazyInitializationError.

我在哪里错了?:)任何人都可以指向一个使用连接表的双向关联的例子.如果所有权保留在A类,我已经搜索了hibernate.org上的文档,但我似乎无法找到它.

-Daniel

java hibernate

12
推荐指数
1
解决办法
1万
查看次数

在JSF中使用JPA实体.哪个是防止LazyInitializationException的最佳策略?

希望听听有关从JSF UI编辑JPA实体的最佳实践的专家.

所以,关于这个问题的几句话.

想象一下,我有持久化对象MyEntity,我将其取出进行编辑.在DAO层我使用

return em.find(MyEntity.class, id);
Run Code Online (Sandbox Code Playgroud)

MyEntity在"父"实体上返回带有代理的实例 - 想象其中一个是MyParent.MyParent被提取为代理问候语@Access(AccessType.PROPERTY):

@Entity
public class MyParent {

    @Id
    @Access(AccessType.PROPERTY)    
    private Long id;
    //...
}
Run Code Online (Sandbox Code Playgroud)

和MyEntity有它的参考:

@ManyToOne(fetch = FetchType.LAZY)
@LazyToOne(LazyToOneOption.PROXY)
private MyParent myParent;
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.在UI中,我只是直接使用获取的对象而不创建任何值对象,并使用选择列表中的父对象:

<h:selectOneMenu value="#{myEntity.myParent.id}" id="office">
    <f:selectItems value="#{parents}"/>
</h:selectOneMenu>
Run Code Online (Sandbox Code Playgroud)

一切都好,没有LazyInitializationException发生.但是当我保存对象时,我收到了

LazyInitializationException: could not initialize proxy - no Session
Run Code Online (Sandbox Code Playgroud)

MyParent代理setId()方法.

如果我改变MyParent关系,我可以轻松解决问题EAGER

@ManyToOne(fetch = FetchType.EAGER)
private MyParent myParent;
Run Code Online (Sandbox Code Playgroud)

或使用获取对象left join fetch p.myParent(实际上我现在这样做).在这种情况下,保存操作正常,并且关系MyParent透明地更改为新对象.不需要执行其他操作(手动复制,手动参考设置).非常简单方便. …

jsf hibernate jpa lazy-initialization

10
推荐指数
2
解决办法
4928
查看次数

可以延迟加载休眠嵌入对象吗?

我有一个 Hibernate Entity,它有几个非常胖但很少使用的嵌入式对象。我想让嵌入的对象延迟加载,但理想情况下我不想将信息移动到单独的表中。

是否可能,以及如何注释要延迟加载的嵌入对象?

hibernate lazy-loading

6
推荐指数
1
解决办法
7632
查看次数

SpringMVC + Hibernate Tomcat 500,json没有堆栈跟踪

当我从Spring的服务层返回实体列表时,我不断从Tomcat收到错误500.如果我只是在内存中实时制作实体,我就不会收到错误并且它们返回正常,所以这是专门针对事务做的事情.

我的控制器中有以下方法...

@RequestMapping(value = "{examid}", method = RequestMethod.GET)
@ResponseBody
public List<Exam> getExam(@PathVariable String examid, Model model) {
    return examService.getAllExams();
}
Run Code Online (Sandbox Code Playgroud)

调用此方法时,tomcat显示错误500并且根本没有堆栈跟踪.我甚至把它包裹在try catch中,并且堆栈跟踪中没有任何内容.

这项服务只是叫做dao ...

@Service("examService")
public class ExamServiceImpl implements ExamService{

    @Autowired
    private ExamDao examDao;

        @Override
        @Transactional(readOnly = true)
        public List<Exam> getAllExams() {
            return examDao.getAllExams();
        }
Run Code Online (Sandbox Code Playgroud)

而这个dao只返回一个简单的HQL脚本......

@Repository("examDao")
public class ExamDaoImpl implements ExamDao {
@Autowired
    private SessionFactory sessionFactory;

    @Override
    public List<Exam> getAllExams() {
        return sessionFactory.getCurrentSession().createQuery("from Exam")
                .list();
    }
Run Code Online (Sandbox Code Playgroud)

最初,我认为这与懒惰加载的实体有关,我的实体在下面,你可以看到,它们非常简单

@Entity
@Table(name = "exams")
public class Exam implements Serializable {

    private static …
Run Code Online (Sandbox Code Playgroud)

java spring hibernate spring-mvc jackson

4
推荐指数
1
解决办法
3962
查看次数

Spring Boot JPA Lazy Fetch 不起作用

我有以下两个域对象 Suggestion 和 UserProfile

它们以一对多的关系相互映射。当我使用 Spring Data JPA 获取所有建议时,我会使用每个建议对象获得相应的用户对象。即使我设置fetchFetchType.Lazy. 以下是我的代码:

建议.java

@Entity
@Table(name="suggestion")
@JsonIgnoreProperties({"suggestionLikes"})
public class Suggestion {

public Suggestion() {
    // TODO Auto-generated constructor stub
}

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="suggestion_id")
private Integer suggestionId;

@Column(name="description")
private String description;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="suggestion_by")
private UserProfile user;

//getters and setters
}
Run Code Online (Sandbox Code Playgroud)

用户配置文件

@Entity
@Table(name = "user_master")
@JsonIgnoreProperties({"suggestions", "suggestionLikes"})
public class UserProfile implements Serializable {

/**
 * 
 */
private static final long serialVersionUID = 7400472171878370L;


public UserProfile() {

}


@Id …
Run Code Online (Sandbox Code Playgroud)

java spring hibernate spring-data-jpa spring-boot

4
推荐指数
2
解决办法
7351
查看次数