相关疑难解决方法(0)

何时使用EntityManager.find()与EntityManager.getReference()一起使用JPA

我遇到过一种情况(我觉得很奇怪,但可能很正常),我使用EntityManager.getReference(LObj.getClass(),LObj.getId())获取数据库实体,然后将返回的对象传递给坚持在另一张桌子上.

所以基本上流程是这样的:

class TFacade{

  createT(FObj, AObj) {
    T TObj = new T();
    TObj.setF(FObj);
    TObj.setA(AObj);
    ...
    EntityManager.persist(TObj);
    ...
    L LObj = A.getL();
    FObj.setL(LObj);
    FFacade.editF(FObj);
  }
}

@TransactionAttributeType.REQUIRES_NEW
class FFacade{

  editF(FObj){
    L LObj = FObj.getL();
    LObj = EntityManager.getReference(LObj.getClass(), LObj.getId());
    ...
    EntityManager.merge(FObj);
    ...
    FLHFacade.create(FObj, LObj);
  }
}

@TransactionAttributeType.REQUIRED
class FLHFacade{

  createFLH(FObj, LObj){
    FLH FLHObj = new FLH();
    FLHObj.setF(FObj);
    FLHObj.setL(LObj);
    ....
    EntityManager.persist(FLHObj);
    ...
  }
}

我得到以下异常"java.lang.IllegalArgumentException:未知实体:com.my.persistence.L $$ EnhancerByCGLIB $$ 3e7987d0"

在查看了一段时间之后,我终于想通了,因为我正在使用EntityManager.getReference()方法,因为该方法正在返回代理,所以我得到了上述异常.

这让我想知道,何时建议使用EntityManager.getReference()方法而不是EntityManager.find()方法

如果EntityManager.getReference()无法找到正在搜索的实体本身非常方便,则会抛出EntityNotFoundException.如果EntityManager.find()方法无法找到实体,则它仅返回null.

关于事务边界,听起来像你需要在将新发现的实体传递给新事务之前使用find()方法.如果你使用getReference()方法,那么你可能会遇到类似我的情况,但有上述异常.

java persistence jpa java-ee

98
推荐指数
4
解决办法
13万
查看次数

EntityManager.find()和EntityManger.getReference()之间有什么区别?

什么是区别

<T> T EntityManager.find(Class<T> entityClass, Object primaryKey) and 
<T> T EntityManager.getReference(Class<T> entityClass, Object primaryKey) 
Run Code Online (Sandbox Code Playgroud)

我认为getReference如果被管理则返回实体.并且如果它被管理则查找返回实体,否则在数据库上执行SQL以使其受管.

请确认.


上下文:从webapp我得到要删除的对象的主键(pk类型为long); 应该管理实体以删除.

EntityManager.remove(Object entity)
Run Code Online (Sandbox Code Playgroud)

将托管实体传递给entitymanager删除方法'什么是更好更正确的选项?找到还是得到参考?'

java jpa entitymanager

46
推荐指数
3
解决办法
5万
查看次数

使用Spring Data JpaRepositories的LazyInitializationException

我有以下实体:

用户:

@Entity
public class User {

    @Id
    @Column(nullable = false)
    private String email = "";

    @Column(nullable = false)
    private String nickname = "";

    @Column(nullable = false)
    private String password = "";

    @ManyToMany(cascade = CascadeType.ALL)
    private List<NewsSource> newsSources;

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

新闻来源:

@Entity
public class NewsSource {

    @Id
    @Column(nullable = false)
    private URL url;

    private LocalDateTime updateTime;

    @OneToMany(cascade = CascadeType.ALL)
    private List<News> newses;

    @ManyToMany(cascade = CascadeType.ALL)
    private List<User> users;
}
Run Code Online (Sandbox Code Playgroud)

UsersRepository和NewsSourcesRepository是Spring Data JPA中的简单JpaRepositories.他们的配置如下:

@Configuration
@EnableTransactionManagement
@PropertySource("classpath:database_config.properties")
@EnableJpaRepositories(basePackages = …
Run Code Online (Sandbox Code Playgroud)

java spring hibernate jpa spring-data

5
推荐指数
1
解决办法
4019
查看次数