Spring Transaktionen funktionieren nicht

Dieses Thema Spring - Transaktionen funktionieren nicht im Forum "Application Tier" wurde erstellt von Todo, 19. Jan. 2014.

Thema: Transaktionen funktionieren nicht Hi @ all, ich verzweifel so langsam, ich finde einfach den Fehler nicht. Ich hoffe mir kann jemand helfen:...

  1. Hi @ all,

    ich verzweifel so langsam, ich finde einfach den Fehler nicht.
    Ich hoffe mir kann jemand helfen:

    Folgendes, Spring Controller packt in eine View ein UserDTO Objekt, die erforderlichen Daten werden ausgefüllt und es soll dann in die Datenbank gepackt werden. Meine Datenbank + Transaktion wird so deklariert:
    [XML]
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
    Index of /schema/tx
    http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
    Index of /schema/aop
    http://www.springframework.org/schema/aop/spring-aop-3.2.xsd">

    <tx:annotation-driven />

    <bean id="mysqlDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://192.168.1.10:3306/ba_am" />
    <property name="username" value="xxxx" />
    <property name="password" value="xxxx" />
    </bean>

    <bean id="transactionManager"
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="mysqlDataSource" />
    </bean>

    </beans>
    [/XML]

    Meine Dao arbeitet mit dem JDBCTemplate von Spring, das Interface:
    Code (Java):

    public interface UserDAO {

    public User getByUsername(String username);
     
     public User getByEmail(String username);
     
     public User getById(Long id);
     
     public void createUser(User user);
     
     ......
    }
     
    Und die Implementierung:
    Code (Java):

    @Repository
    public class UserDAOImpl extends JdbcDaoSupport implements UserDAO {

        @Autowired
        public UserDAOImpl(@Qualifier("mysqlDataSource") DataSource dataSource) {
            setDataSource(dataSource);
        }

        @Override
        public User getByUsername(String username) {
            try {
                return (User) getJdbcTemplate().queryForObject(
                        "select * from tbl_user as u where u.username = ?",
                        new Object[]{username},
                        new UserMapper());
            } catch (EmptyResultDataAccessException erdae) {
                return null;
            }
        }

        @Override
        public User getByEmail(String email) {
            try {
                return (User) getJdbcTemplate().queryForObject(
                        "select * from tbl_user as u where u.email = ?",
                        new Object[]{email},
                        new UserMapper());
            } catch (EmptyResultDataAccessException erdae) {
                return null;
            }
        }

        @Override
        public User getById(Long id) {
            try {
                return (User) getJdbcTemplate().queryForObject(
                        "select * from tbl_user as u where u.user_id = ?",
                        new Object[]{id},
                        new UserMapper());
            } catch (EmptyResultDataAccessException erdae) {
                erdae.printStackTrace();
                return null;
            }
        }

        @Override
        public void createUser(User user) {
            getJdbcTemplate().update(
                    "INSERT INTO tbl_user(create_time, email, enabled, first_name, last_name, "
                    + "password, username) VALUES (?,?,?,?,?,?,?)",
                    new Object[]{
                        user.getCreateTime(), user.getEmail(),
                        user.getEnabled(), user.getFirstName(), user.getLastName(),
                        user.getPassword(), user.getUsername()});

        }

    .....
    }
     

    Und mein Service:
    Code (Java):

    @Service("userRegistrationService")
    @Transactional
    public class UserRegistrationServiceImpl implements UserRegistrationService {

        @Autowired
        UserDAO userdao;

        private final Logger log = Logger.getLogger(UserRegistrationServiceImpl.class.getName());

        @Override
        @Transactional(readOnly = false, rollbackFor = NullPointerException.class, propagation = Propagation.REQUIRED, timeout = 30)
        public void register(final UserDTO userDTO) throws UsernameAlreadyExistsException,
                UserEmailAlreadyExistsException {

            User usernameTest = userdao.getByUsername(userDTO.getUsername());
            if (usernameTest != null) {
                throw new UsernameAlreadyExistsException(userDTO.getUsername());
            }

            User userEmailTest = userdao.getByEmail(userDTO.getEmail());
            if (userEmailTest != null) {
                throw new UserEmailAlreadyExistsException(userDTO.getEmail());
            }

            User toPersitUser = new User();
            toPersitUser.setUsername(userDTO.getUsername());
            toPersitUser.setFirstName(userDTO.getFirstName());
            toPersitUser.setLastName(userDTO.getLastName());
            toPersitUser.setEmail(userDTO.getEmail());
            toPersitUser.setCreateTime(new Date());
            toPersitUser.setEnabled(true);
            toPersitUser.setPassword(RandomStringUtils.random(6, true, true));
            userdao.createUser(toPersitUser);
            // Löst Nullpointer Exception aus
            userdao.createUser(null);
        }
    }
     
    So, das Problem: es ist der erste User trotzdem eingetragen, kann mir jemand sagen was ich falsch mache? Danke schon mal ihr würdet mir sehr helfen.
     
    Zuletzt bearbeitet: 19. Jan. 2014
  2. Vielleicht hilft dir das Java-Tutorial weiter. Hier klicken --> (Klick)
  3. Hi,

    welche MySQL Speicher-Engine verwendest du für deine User-Tabelle? InnoDB oder MyISAM?
    Evtl. verwendest du MyISAM, denn diese Engine unterstützt keine Transaktionen.