Java 如何使用.properties在Hibernate中配置和获取会话
我找到的所有示例都包含关于Hibernate.cfg.xml的信息,但我使用的是Hibernate.properties而不是它 在资源文件夹中:Java 如何使用.properties在Hibernate中配置和获取会话,java,spring,hibernate,jpa,hibernate-session,Java,Spring,Hibernate,Jpa,Hibernate Session,我找到的所有示例都包含关于Hibernate.cfg.xml的信息,但我使用的是Hibernate.properties而不是它 在资源文件夹中: hibernate.dialet=org.hibernate.dialect.PostgreSQL9Dialect hibernate.show_sql=true hibernate.hbm2ddl.auto=update 我在这里使用属性: @Configuration @EnableJpaRepositories("com.some.serve
hibernate.dialet=org.hibernate.dialect.PostgreSQL9Dialect
hibernate.show_sql=true
hibernate.hbm2ddl.auto=update
我在这里使用属性:
@Configuration
@EnableJpaRepositories("com.some.server.repository")
@EnableTransactionManagement
@PropertySource("classpath:db.properties")
@ComponentScan("com.some.server")
public class DataBaseConfig {
@Resource
private Environment env;
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(dataSource());
em.setPackagesToScan(env.getRequiredProperty("db.entity.package"));
em.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
em.setJpaProperties(getHibernateProperties());
return em;
}
@Bean
public DataSource dataSource() {
BasicDataSource ds = new BasicDataSource();
ds.setUrl(env.getRequiredProperty("db.url"));
ds.setDriverClassName(env.getRequiredProperty("db.driver"));
ds.setUsername(env.getRequiredProperty("db.username"));
ds.setPassword(env.getRequiredProperty("db.password"));
ds.setInitialSize(Integer.valueOf(env.getRequiredProperty("db.initialSize")));
ds.setMinIdle(Integer.valueOf(env.getRequiredProperty("db.minIdle")));
ds.setMaxIdle(Integer.valueOf(env.getRequiredProperty("db.maxIdle")));
ds.setTimeBetweenEvictionRunsMillis(Long.valueOf(env.getRequiredProperty("db.timeBetweenEvictionRunsMillis")));
ds.setMinEvictableIdleTimeMillis(Long.valueOf(env.getRequiredProperty("db.minEvictableIdleTimeMillis")));
ds.setTestOnBorrow(Boolean.valueOf(env.getRequiredProperty("db.testOnBorrow")));
ds.setValidationQuery(env.getRequiredProperty("db.validationQuery"));
return ds;
}
@Bean
public PlatformTransactionManager transactionManager() {
JpaTransactionManager manager = new JpaTransactionManager();
manager.setEntityManagerFactory(entityManagerFactory().getObject());
return manager;
}
public Properties getHibernateProperties() {
try {
Properties properties = new Properties();
InputStream is = getClass().getClassLoader().getResourceAsStream("hibernate.properties");
properties.load(is);
return properties;
} catch (IOException e) {
throw new IllegalArgumentException("Can't find 'hibernate.properties' in classpath!", e);
}
}
}
是否有机会使用hibernate.properties获取会话(用于fetch.LAZY)
更新:
我有JPA,但仍然需要会话
在我的实体中,我有:
@Entity
@Table(name = "users")
public class User {
...
@ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE, CascadeType.PERSIST})
@JoinColumn(name = "id_city", nullable = true)
private City city;
public City getCity() {
return city;
}
public void setCity(City city) {
this.city = city;
}
...
}
以及:
@实体
@表(name=“city”)
公营城市{
....
@OneToMany(fetch=FetchType.LAZY,mappedBy=“city”)
@杰索尼奥雷
私人用户;
公共集getUsers(){
返回用户;
}
公共void集合用户(集合用户){
this.users=用户;
}
...
}
因此,当我试图获得:
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserRepository userRepository;
@Autowired
private ProfessionRepository profRepository;
@RequestMapping(value = "", method = RequestMethod.GET)
public List<User> getAllUsers() {
// List<User> list = userRepository.findAll();
return userRepository.findAll();
}
From:
public interface UserRepository extends JpaRepository<User, Long>{
}
@RestController
@请求映射(“/user”)
公共类用户控制器{
@自动连线
私有用户存储库用户存储库;
@自动连线
私人专业知识库;
@RequestMapping(value=”“,method=RequestMethod.GET)
公共列表getAllUsers(){
//List=userRepository.findAll();
返回userRepository.findAll();
}
发件人:
公共接口用户存储库扩展了JpaRepository{
}
我有一个错误,如果id_city不是空的:
如果id_city为空(Fetch.LAZY未使用),则一切正常:
我认为您需要在实体文件而不是属性文件中定义延迟提取。我有延迟提取实体,但没有会话,我有一个错误“no session”。您能否显示操作实体的代码?您是否自动连接EntityManager?确定您使用的是JPA API还是Hibernate API。在JPA中,您不会获得延迟提取“session”;它是EntityManager…所以请更新您的问题以澄清.JPA没有这样的“hibernate.properties”“调用findAll方法后,持久性上下文关闭。因此,当json序列化发生时,它无法检索城市,因为Persience上下文已关闭。您可以将@JsonIgnore添加到city属性,或者如果要检索城市,则需要在findAll方法中调用getCity()方法。”(或者删除fetch=FetchType.LAZY,这是无用的)
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserRepository userRepository;
@Autowired
private ProfessionRepository profRepository;
@RequestMapping(value = "", method = RequestMethod.GET)
public List<User> getAllUsers() {
// List<User> list = userRepository.findAll();
return userRepository.findAll();
}
From:
public interface UserRepository extends JpaRepository<User, Long>{
}