【发布时间】:2016-04-07 20:05:40
【问题描述】:
Spring MVC/安全,休眠项目。结构:
当我使用来自控制器的方法时,其中包含查询 - 一切正常, 但不适用于持久/合并。
不工作 - 将产品添加到数据库
@Override
public void addProduct(Products product){
entityManager.persist(product);
}
working - 在视图中显示产品。
@Override
public List<Products> listall(){
Query query;
query = entityManager.createQuery("select p From Products p");
return( List<Products>) query.getResultList();
弹簧配置
@EnableWebMvc
@Configuration
@ComponentScan({"com.vdp.*"})
@EnableTransactionManagement
@Import({ SecurityConfig.class })
public class AppConfig {
@Bean(name = "dataSource")
public BasicDataSource dataSource() {
BasicDataSource ds = new BasicDataSource();
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql://localhost:3306/proj");
ds.setUsername("root");
ds.setPassword("root");
return ds;
}
@Bean
public SessionFactory sessionFactory() {
LocalSessionFactoryBuilder builder = new LocalSessionFactoryBuilder(dataSource());
builder
.scanPackages("com.vdp.users")
.addProperties(getHibernateProperties());
return builder.buildSessionFactory();
}
private Properties getHibernateProperties() {
Properties prop = new Properties();
prop.put("hibernate.format_sql", "true");
prop.put("hibernate.show_sql", "true");
prop.put("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");
return prop;
}
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory
(DataSource dataSource, JpaVendorAdapter jpaVendeorAdapter)
{
LocalContainerEntityManagerFactoryBean entityManagerFactory = new LocalContainerEntityManagerFactoryBean();
entityManagerFactory.setDataSource(dataSource);
entityManagerFactory.setJpaVendorAdapter(jpaVendeorAdapter);
entityManagerFactory.setPackagesToScan("com.vdp*");
return entityManagerFactory;
}
@Bean
public JpaVendorAdapter jpaVendorAdapter()
{
HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter();
adapter.setShowSql(true);
adapter.setGenerateDdl(true);
adapter.setDatabasePlatform("org.hibernate.dialect.MySQLDialect");
return adapter;
}
@Bean
public CommonsMultipartResolver multipartResolver() {
return new CommonsMultipartResolver();
}
@Bean
public HibernateTransactionManager txManager() {
return new HibernateTransactionManager(sessionFactory());
}
@Bean
public InternalResourceViewResolver viewResolver() {
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setViewClass(JstlView.class);
viewResolver.setPrefix("/WEB-INF/pages/");
viewResolver.setSuffix(".jsp");
return viewResolver;
}
实体
@Table(name = "products")
public class Products implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "idProducts")
private long id;
@Column(name = "description")
private String description;
@Column(name = "price")
private String price;
@Column(name = "image")
private byte [] image;
public Products() {
}
public Products(String description, String price, byte[] image) {
this.description = description;
this.price = price;
this.image = image;
}
public Products(String description, String price, byte[] image, List<Category> categories) {
this.description = description;
this.price = price;
this.image = image;
this.categories = categories;
}
@ManyToMany
@JoinTable(
name = "category_products",
joinColumns ={@JoinColumn (name = "Products_idProducts", referencedColumnName = "idProducts")},
inverseJoinColumns = {@JoinColumn(name = "category_id", referencedColumnName = "id")}
)
List<Category> categories = new ArrayList<Category>();
@ManyToMany
@JoinTable(
name = "users_product",
joinColumns ={@JoinColumn (name = "Products_idProducts", referencedColumnName = "idProducts")},
inverseJoinColumns = {@JoinColumn(name = "users_username", referencedColumnName = "username")}
)
List<User> usersList = new ArrayList<User>();
交易部分:
@Service
public class MyService {
@Autowired
private UserDao userDao;
@Autowired
private CategoryDAO categoryDAO;
@Autowired
private ProductsDAO productsDAO;
//admin part---------------------------------------
@Transactional
public void deleteOneProduct(Products product){
productsDAO.deleteOne(product);
}
@Transactional
public void deleteManyProducts(long [] toDelete){
productsDAO.deleteMany(toDelete);
}
//not working!!!!
@Transactional
public void addProduct(Products product){
productsDAO.addProduct(product);
}
@Transactional
public List <Products> displayProducts(){
return productsDAO.listall();
}
// end of admin part---------------------------------------
【问题讨论】:
-
在您展示的内容中,您没有在哪里展示您是如何处理事务管理的。您是否在控制器或服务方法的任何地方使用
@Transactional,以便您的持久性上下文实际上在正在运行的事务中运行?如果不是,则持久化上下文本质上是只读的;为什么您的查询有效,但您的插入未能显示在日志中。