首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GAE上的Spring框架JPA2 @OneToMany关系

GAE上的Spring框架JPA2 @OneToMany关系
EN

Stack Overflow用户
提问于 2014-08-13 17:48:28
回答 1查看 172关注 0票数 1

我正在使用SpringFramework4.0.5和SpringDataJPA1.3.5开发GAE。我试图检索OneToMany关系中的对象列表,但收到以下错误:

您刚刚尝试访问字段"organizationMemberships“,但是当您分离对象时,这个字段并没有被分离。不要访问这个字段,或者在分离对象时分离它。

用户实体是:

代码语言:javascript
复制
@Entity
@Table(name="users")
@NamedQuery(name="User.findAll", query="SELECT u FROM User u")
public class User implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO )
    private Long id;

    private String email;

    private String password;

    private String salt;

    private String slug;

    private int status;

    private String username;

    //bi-directional one-to-one association to UserContact
    @OneToOne(mappedBy="user")
    private UserContact userContact;

    //bi-directional one-to-one association to UserDetail
    @OneToOne(mappedBy="user", cascade = CascadeType.ALL)
    private UserDetail userDetail;

    //bi-directional many-to-one association to UsersApisession
    @OneToMany(mappedBy="user")
    private List<UsersApisession> usersApisessions;

    @OneToMany(mappedBy="user", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    private List<OrganizationMember> organizationMemberships;

    ...

}

而OrganizationMember是:

代码语言:javascript
复制
@Entity
@Table(name="organization_members")
@NamedQuery(name="OrganizationMember.findAll", query="SELECT o FROM OrganizationMember o")
public class OrganizationMember implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO )
    private Long id;

    private String email;

    private int status;

    //bi-directional many-to-one association to Organization
    @ManyToOne
    private Organization organization;

    //bi-directional many-to-one association to User @JoinColumn(name="member_id")
    @ManyToOne(fetch = FetchType.LAZY)
    private User user;

    //bi-directional many-to-one association to OrganizationPosition
    @ManyToOne
    @JoinColumn(name="position_id")
    private OrganizationPosition organizationPosition;

    ...

}

根据Spring,我的userRepository是一个接口:

代码语言:javascript
复制
@Transactional
public interface UserRepository extends JpaRepository<User, Long>{

    User findByEmail(String email);

    User findBySlug(String slug);
}

我的控制器的代码如下:

代码语言:javascript
复制
@Controller
public class ProtectedSiteController {

    ...

    @Autowired
    private UserRepository userRepo;

    @RequestMapping(method = RequestMethod.GET, value="/afterLogin")
    public String afterLogin(HttpServletRequest request, HttpServletResponse response){

        Authentication auth = SecurityContextHolder.getContext().getAuthentication();

        User user = userRepo.findByEmail(auth.getName());

        List<OrganizationMember> memberList = user.getOrganizationMemberships();

        ...
    }
}

这是我的事务配置:

代码语言:javascript
复制
@Configuration
@EnableJpaRepositories("com.example.repository")
@EnableTransactionManagement
public class JpaApplicationConfig {

    private static final Logger logger = Logger
            .getLogger(JpaApplicationConfig.class.getName());

    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(){

        Map<String, String> map = new HashMap<String, String>();
        map.put("datanucleus.NontransactionalRead","true");
        map.put("datanucleus.NontransactionalWrite","false");
        map.put("datanucleus.storeManagerType","rdbms");
        map.put("datanucleus.autoCreateSchema" ,"false");
        map.put("datanucleus.validateTables" ,"false");
        map.put("datanucleus.validateConstraints" ,"false");
        map.put("datanucleus.jpa.addClassTransformer" ,"true");
        map.put("datanucleus.singletonEMFForName", "true");

        LocalContainerEntityManagerFactoryBean lce= new LocalContainerEntityManagerFactoryBean();
        lce.setPersistenceProviderClass(org.datanucleus.api.jpa.PersistenceProviderImpl.class);

        DriverManagerDataSource dmds = new DriverManagerDataSource();
        dmds.setDriverClassName("com.mysql.jdbc.Driver");
        dmds.setUrl("jdbc:mysql://localhost:3306/example");
        dmds.setUsername("example");
        dmds.setPassword("example");

        lce.setDataSource(dmds);
        lce.setPackagesToScan("com.example.models");
        lce.setJpaPropertyMap(map);
        lce.setLoadTimeWeaver(new org.springframework.instrument.classloading.SimpleLoadTimeWeaver());
        return lce; 
    }

    @Bean
    public PlatformTransactionManager transactionManager(EntityManagerFactory emf){
        logger.info("Loading Transaction Manager...");
        JpaTransactionManager txManager = new JpaTransactionManager();
        txManager.setEntityManagerFactory(emf);
        return txManager;
    }

    @Bean
    public PersistenceAnnotationBeanPostProcessor postProcessor(){
        return new PersistenceAnnotationBeanPostProcessor();
    }

}

我学习过GAE教程和Spring教程。我犯了什么错?谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-13 18:15:42

快速的诀窍是

使用afterLogin(.) @Transactional..。

问题是,当用户返回时,事务被关闭,因此无法检索组织成员资格(分离)。

另一种解决方案是在LAZY中更改fetch类型,默认情况下@OneToMany是惰性的。

代码语言:javascript
复制
@Service
public class ServiceClass {

    ...

    @Autowired
    private UserRepository userRepo;

    @Transactional
    public List<OrganizationMember> method(String name){

        User user = userRepo.findByEmail(name);

        return user.getOrganizationMemberships();

    }
}

@Controller
public class ProtectedSiteController {

    ...

    @Autowired
    private ServiceClass serviceClass;

    @RequestMapping(method = RequestMethod.GET, value="/afterLogin")
    public String afterLogin(HttpServletRequest request, HttpServletResponse response){

        Authentication auth = SecurityContextHolder.getContext().getAuthentication();

        List<OrganizationMember> memberList = serviceClass.method(auth.getName());

        ...
    }
}

我希望我已经给了你所有关于你问题的答案。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25292876

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档