Spring Transaktionen funktionieren nicht

Diskutiere Transaktionen funktionieren nicht im Application Tier Bereich.
T

Todo

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:
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:
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:
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:
T

torsan

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.
 
Thema: 

Transaktionen funktionieren nicht

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben