Я работаю с весной mvc и используя данные весны jpa, и у меня есть эта ошибка failed to lazily initialize a collection of role could not initialize proxy - no Session
Я знаю, что это происходит, потому что у меня нет открытого сессии, но я не знаю, как сохранить свою сессию открытой после того, как я подключиться к базе данных это мой код до сих пор:Не удалось лениво инициализировать коллекцию роли не удалось инициализировать прокси - нет сеанса
Мой JPA класс конфигурации
@Configuration
@EnableSpringConfigured
@ComponentScan(basePackages = {"com.abc.domain", "com.abc.repository", "com.abc.service","com.abc.authenticate"})
@EnableJpaRepositories(basePackages="com.abc.repository")
public class ConfigJPA
{
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory()
throws ClassNotFoundException
{
LocalContainerEntityManagerFactoryBean em =
new LocalContainerEntityManagerFactoryBean();
em.setDataSource(dataSource());
em.setPackagesToScan("com.abc.domain");
em.setPersistenceProviderClass(HibernatePersistence.class);
em.setJpaProperties(asignarPropiedades());
return em;
}
//Propiedades Hibernate
Properties asignarPropiedades() {
Properties jpaProperties = new Properties();
jpaProperties.put("hibernate.dialect", "org.hibernate.dialect.Oracle10gDialect");
jpaProperties.put("hibernate.format_sql", true);
jpaProperties.put("hibernate.ejb.naming_strategy", "org.hibernate.cfg.ImprovedNamingStrategy");
jpaProperties.put("hibernate.show_sql", true);
return jpaProperties;
}
@Bean
public DataSource dataSource(){
DriverManagerDataSource dataSource =
new DriverManagerDataSource();
dataSource.setDriverClassName("oracle.jdbc.driver.OracleDriver");
//farmatodo22
dataSource.setUrl("jdbc:oracle:thin:@127.0.0.1:1521:XE");
dataSource.setUsername("DATBASE");
dataSource.setPassword("mypassword");
return dataSource;
}
@Bean
public JpaTransactionManager transactionManager()
throws ClassNotFoundException
{
JpaTransactionManager transactionManager =
new JpaTransactionManager();
transactionManager.setEntityManagerFactory(entityManagerFactory().getObject());
return transactionManager;
}
}
это мои классы домена класса
Пользователь
@Entity
@Table(name="User")
public class User implements Serializable {
private static final long serialVersionUID = 1L;
//**PRIMARY KEY**//
@Id
@SequenceGenerator(name="User_id_seq", sequenceName="SEQ_User")
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="User_id_seq")
@Column(name="ID_USER", unique=true, nullable=false, precision=8)
private Long idUser;
@ManyToOne
@JoinColumn(name="id_ldap_server", nullable = false)
private ServerLdap serverLdap;
@ManyToMany
@JoinTable
(
name="Usuario_Rol",
joinColumns =
{
@JoinColumn (name="ID_USER", referencedColumnName="ID_USER")
},
inverseJoinColumns =
{
@JoinColumn (name="id_rol", referencedColumnName="id_rol")
}
)
private List<Rol> roles;
Это моя роль класса
@Entity
@Table(name="ROL")
public class Rol implements Serializable
{
private static final long serialVersionUID = 1L;
//***PRIMARY KEY***///
@Id
@SequenceGenerator(name="ROL_ID_GENERATOR", sequenceName="SEQ_ROL")
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="ROL_ID_GENERATOR")
@Column(name="id_rol", unique=true, nullable=false, precision=8)
private Long idRol;
@ManyToMany(mappedBy="roles")
private List<User> users;
}
Я пытаюсь сделать ManyToMany realtion между Пользователем и Рол, эту работу хорошо, если я поставил fetchType = EAGER, но я не хочу использовать этот тип выборки потому что я думаю, что это не эффективно.
Вы, конечно, не хотите, чтобы сделать тип выборки EAGER. Если у вас есть значительное число пользователей, вы наверняка можете убить свое приложение, потому что пользователю обязательно нужно знать их роли. Если Роли также должны знать всех своих Пользователей, любой пользователь, входящий в систему, приведет к загрузке всех Пользователей в базе данных. – user3360944
Недавно я написал блог о весенних сапогах, джерси и данных JPA. Возможно, вам будет интересно прочитать его, http://bit.ly/1vzHYqi – jasenkoh