2014-02-26 38 views
0

當我使用彈簧數據的JPA和JPA庫JPA沒有會話調用子

這裏是我的源代碼

<beans:bean id="producerService" class="cz.services.RepositoryProducerService" /> 
<jpa:repositories base-package="cz.repository" /> 

<beans:bean id="myEmf" 
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <beans:property name="dataSource" ref="dataSource" /> 
    <beans:property name="packagesToScan" value="cz.models" /> 
    <beans:property name="jpaVendorAdapter"> 
     <beans:bean 
      class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" /> 
    </beans:property> 
    <beans:property name="jpaProperties"> 
     <beans:props> 

      <beans:prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect 
      </beans:prop> 
      <beans:prop key="hibernate.show_sql">true</beans:prop> 
     </beans:props> 
    </beans:property> 
</beans:bean> 

<beans:bean id="transactionManager" 
    class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <beans:property name="entityManagerFactory" ref="myEmf" /> 
</beans:bean> 

<beans:bean id="dataSource" 
    class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <beans:property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
    <beans:property name="url" 
     value="jdbc:mysql://localhost:3306/mydb?zeroDateTimeBehavior=convertToNull&amp;characterEncoding=UTF-8" /> 

    <beans:property name="username" value="root" /> 
    <!--<property name="password" value="test" /> --> 
    <beans:property name="password" value="test"></beans:property> 
</beans:bean> 

,這裏是我的實體和存儲庫類:

package cz.models; 

import java.io.Serializable; 
import javax.persistence.*; 
import java.util.List; 


/** 
* The persistent class for the users database table. 
* 
*/ 
@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 int id; 

    private int enabled; 

    private String password; 

    private String username; 

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

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

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

    public User() { 
    } 

    .... 

    public List<Room> getRooms() { 
     return this.rooms; 
    } 

這裏是用戶儲存庫:

public void setRooms(List<Room> rooms) { 
     this.rooms = rooms; 
    } 

    public Room addRoom(Room room) { 
     getRooms().add(room); 
     room.setUser(this); 

     return room; 
    } 

    public Room removeRoom(Room room) { 
     getRooms().remove(room); 
     room.setUser(null); 

     return room; 
    } 

    public List<UsersData> getUsersData() { 
     return this.usersData; 
    } 

    public void setUsersData(List<UsersData> usersData) { 
     this.usersData = usersData; 
    } 

    public UsersData addUsersData(UsersData usersData) { 
     getUsersData().add(usersData); 
     usersData.setUser(this); 

     return usersData; 
    } 

    public UsersData removeUsersData(UsersData usersData) { 
     getUsersData().remove(usersData); 
     usersData.setUser(null); 

     return usersData; 
    } 

} 

和userRepository:

public interface UserRepository extends JpaRepository<User, Integer> { 
    @Transactional 
    @Query("select u from User u WHERE u.enabled = 1 ") 
    public List<User> findAllactiveUsers(); 
    @Transactional 
    @Query("select u from User u WHERE u.username = :username ") 
    public User findByUsername(@Param("username")String username); 
} 

和我的春季安全服務:

@Service 
public class MyUserDetailsService implements UserDetailsService { 

    @Resource 
    UserRepository repositoryUser; 
    @Resource 
    AuthorityRepository repositoryAuthority; 

    public UserDetails loadUserByUsername(String username) { 
     System.out.println("start"); 
     cz.models.User userModel = null; 
     UserDetails userDetail = null; 
     try{ 
      userModel = repositoryUser.findByUsername(username); 

     // User user = userModel; 
     System.out.println(userModel.getUsername()); 

     List<Authority> authorities = repositoryAuthority.findAllByUser(userModel); 
//  repositoryUserData.findAll(); 
     System.out.println(userModel.getAuthorities().size()); 
     Collection<SimpleGrantedAuthority> collectionAuthorities = new ArrayList<SimpleGrantedAuthority>(); 
     for (int i = 0; i < authorities.size(); i++) { 
      collectionAuthorities.add(new SimpleGrantedAuthority(authorities 
        .get(i).getAuthority())); 
     } 

     userDetail = new User(userModel.getUsername(), 
       userModel.getUsername(), collectionAuthorities); 
     }catch(Exception e){ 
      e.printStackTrace(); 
     } 
     return userDetail; 

    } 
} 

的問題是:當我想叫 - 這個和平的代碼:

userModel.getAuthorities() 

其呼兒(分貝的fk)。我有個例外:

org.hibernate.LazyInitializationException: could not initialize proxy - no Session 

當我添加第二個存儲庫權限時,我沒有這個沒有會話問題。但我不希望每次在我的存儲庫中創建方法。

List<Authority> authorities = repositoryAuthority.findAllByUser(userModel); 

我必須使用的,而不是eanger hibernate.LazyInitialization。(和一些穩定)

我看到很多帖子這個問題與JPA,但對我來說沒有什麼工作:(

回答

1

使用獲取你想要這樣的數據,它是存在的,當你需要它的查詢。

@Query("select u from User u left join fetch u.authorities WHERE u.username = :username ") 
public User findByUsernameFetchAuthorities(@Param("username")String username); 

使用findByUsernameFetchAuthorities當你要訪問當局將他們造成被預取,避免錯誤,並保持懶惰地提取每個其他查詢。