mysql - Hibernate未插入到mysql : showing insert statements

标签 mysql spring hibernate junit transactions

我正在使用 spring 和 hibernate 做一个项目。 Hibernate 显示“insert sql”语句,但表是空的。我在stackoverflow上查了类似的问题。但我找不到任何与我的问题类似的问题。

//这些是我的实体类

//歌曲类

    @Entity
    @Table(name="Song", catalog="myFavMusic")
    public class Song implements Serializable {

        @Id
        @GeneratedValue(strategy = IDENTITY)
        private Integer id;

        public Song(){

        }
        public Song(String title, Album album, Singer singer, Integer rating) {
            super();
            Title = title;
            this.album = album;
             this.singer = singer;
             this.rating = rating;
        }

        private String Title;

        @ManyToOne(fetch = FetchType.EAGER,cascade = CascadeType.ALL)
        @JoinColumn(name = "ALBUM_ID", nullable = false)
        private Album album;

        @ManyToOne(fetch = FetchType.EAGER,cascade = CascadeType.ALL)
        @JoinColumn(name = "SINGER_ID", nullable = false)
        private Singer singer;

        private Integer rating;
    }

//相册

    @Entity
    public class Album {    
        public Album(String title, String type, Integer releasedYear) {
            super();
            this.title = title;
            this.type = type;
            this.releasedYear = releasedYear;
        }

        @Id
        @GeneratedValue
        @Column(name = "ALBUM_ID", unique = true, nullable = false, length = 20)
        private Integer id;

        @Column(name = "TITLE", unique = true, nullable = false)
        private String title;

        @Column(name = "TYPE", unique = true, nullable = false)
        private String type;

        @Column(name = "RELEASED_YEAR", unique = true, nullable = false)
        private Integer releasedYear;
    }

//歌手类

    @Entity
    public class Singer {

        public Singer(String singerName, Date dob) {
           super();
           this.singerName = singerName;
           this.dob = dob;
        }

        @Id
        @GeneratedValue
        @Column(name = "SINGER_ID", unique = true, nullable = false, length = 20)
        private Integer id;
        private String singerName;
        private Date dob;
   }

//这是我的 DAO 接口(interface)

   public interface MusicDao {
           public void addSong(Song song);
       public List<Song> listAllSongsBySpec(SongSpec spec);
   }

//这是我的 DAO 实现

    public class MusicDaoImpl implements MusicDao {

        @Autowired
        private SessionFactory sessionFactory;

        public void addSong(Song song) {
            sessionFactory.getCurrentSession().save(song);
        }
    }

//Spring配置

    <bean id="sessionFactory"
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
        <property name="dataSource"><ref bean="dataSource" /></property>
    <property name="hibernateProperties">
           <props>
                   <prop  key="hibernate.dialect">  org.hibernate.dialect.MySQLDialect
                    </prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.hbm2ddl.auto">update</prop>
        </props>
    </property>
    <property name="packagesToScan" value="com.myprojects.myfavmusic.domain" />
</bean>
<bean id="dataSource"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="${jdbc.driverClassName}" />
    <property name="url" value="${jdbc.url}" />
    <property name="username" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
</bean>
<bean class=
            "org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location">
        <value>file:src/test/resources/config/database-unitFav.properties
        </value>
    </property>
</bean>
<bean id="musicDao" class="com.myprojects.myfavmusic.dao.impl.MusicDaoImpl"
    autowire="byName">
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
<bean id="transactionManager"
    class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory"></property>
</bean>

//我的单元测试来测试这个

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations={"file:src/test/ApplicationContext- unitFav.xml"})
    public class MusicDaoImplTest extends TestCase {

        @Autowired
        private MusicDao musicDao;
        @Test
        @Transactional
        public void testAddSong() {
            Album album = new Album("album1","movie",2009);
            Singer singer = new Singer("singer 1",new Date());
            Song song = new Song("song 1",album,singer,0);
            musicDao.addSong(song);
            assertTrue(true);
       }

}

这对我来说似乎是一个奇怪的问题。 Hibernate 不会提示任何错误。但是当我检查数据库时没有记录。我认为这可能是冲洗模式的问题。但我相信默认的冲洗模式是自动。无论如何,我也尝试指定冲洗模式。但问题仍然存在。请帮我解决这个问题?

提前致谢, 阿伦

最佳答案

实际上这是我期望的行为(测试结束后什么也没有)。

当您在测试结束时使用 @Transactional 标记测试方法时,该方法中所做的所有更改都将自动回滚。 (如引用指南中的 here 所述。

当您将 @Transactional 移至 dao 而不是测试用例时,测试不再是事务性的,并且数据将保留。我不会将此作为最佳实践,因为对于初学者来说,应该是事务性的不是您的 dao,而是您的服务层。其次,您不希望一项测试的数据干扰另一项测试。

您确实应该测试测试方法中数据的存在(而不是使用 sql 浏览器或类似的东西。)

@ContextConfiguration(locations={"file:src/test/ApplicationContext- unitFav.xml"})
public class MusicDaoImplTest extends AbstractTransactionalJUnit4SpringContextTests {

    @Autowired
    private MusicDao musicDao;

    @Autowired
    private SessionFactory sf;

    @Test
    public void testAddSong() {
        Album album = new Album("album1","movie",2009);
        Singer singer = new Singer("singer 1",new Date());
        Song song = new Song("song 1",album,singer,0);
        musicDao.addSong(song);
        sf.getCurrentSession().flush(); // Similate a flush at the end of a transaction
        int count = countRowsInTable("song"); // Data should be in the table
        assertEquals(1, count);
   }

类似的事情。

最后请注意,您的测试用例也存在轻微缺陷,您混合了 JUnit3 和 JUnit4 类型。您正在扩展 TestCase(即 JUnit3),而您在要测试的方法上使用 @Test 注释。这是等待发生的麻烦(奇怪的测试结果、执行等)。

关于mysql - Hibernate未插入到mysql : showing insert statements,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19754138/

相关文章:

sql - 仅使用 SQL 将 Blob 从 MySQL 数据库导出到文件

php - 在 php 中提交编辑表单后,日期返回 00 00 0000 值

java - 尝试使用 URIUtils 对 java 中的字符串进行 URIEncode

java - 如何使用 YAML 文件在 Spring Boot 中配置 Swagger?

java - 是否可以使用 Hibernate 插入非规范化的 bean?

java - 在 Hibernate 中获取所有 session 缓存的对象

SQL 与字母表 - 像字典一样思考

mysql - CodeIgniter - 在数据库插入后返回值

java - Spring Boot post HTTP 请求

hibernate - 对于使用 Spring 和 JDBCTemplates、iBatis/myBatis 或 Hibernate 的新项目?