【问题标题】:Data not persisted into database using Spring DATA数据未使用 Spring DATA 持久化到数据库中
【发布时间】:2017-08-02 03:47:25
【问题描述】:

我正在使用 Spring 数据将我的数据保存到数据库中。我写了一个测试用例。它运行完美,但不会将数据插入数据库。

DatabaseTest.java

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes={WebAppConfig.class, PersistenceConfig.class, 
SecurityConfig.class, PropertyPlaceholderConfig.class})
@WebAppConfiguration

@Transactional
public class DatabaseTest {

@Autowired private UsersRepository usersRepository;
@Autowired private LoginsRepository loginsRepository;
@Test
public void saveOne2One(){
    Logins lgn = new Logins();
    lgn.setUserName("userName");
    lgn.setPasswordHash("dfaskjdfaksjfdalksdf");

    Users usr = new Users();
    usr.setFirstName("test");
    usr.setLastName("last");
    usr.setUserName("userName");

    usr.setLogins(lgn);
    lgn.setUsers(usr);
    loginsRepository.save(lgn);
    //usersRepository.save(usr);
    loginsRepository.flush();
}
}

Users.java

@Entity
@Table(name = "users", schema = "abcd")
public class Users implements java.io.Serializable {

/**
 * 
 */
private static final long serialVersionUID = 5074527544635474973L;
private Long userId;
private String firstName;
private String lastName;
private String userName;
private Logins logins;

public Users() {
}

public Users(Long userId) {
    this.userId = userId;
}

public Users(Long userId, String firstName, String lastName,
        String userName, Logins logins) {
    this.userId = userId;
    this.firstName = firstName;
    this.lastName = lastName;
    this.userName = userName;

    this.logins = logins;

}

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "user_id", nullable = false)
public Long getUserId() {
    return this.userId;
}

public void setUserId(Long userId) {
    this.userId = userId;
}

@Column(name = "first_name")
public String getFirstName() {
    return this.firstName;
}

public void setFirstName(String firstName) {
    this.firstName = firstName;
}

@Column(name = "last_name")
public String getLastName() {
    return this.lastName;
}

public void setLastName(String lastName) {
    this.lastName = lastName;
}

@Column(name = "user_name")
public String getUserName() {
    return this.userName;
}

public void setUserName(String userName) {
    this.userName = userName;
}
}

Logins.java

@Entity
@Table(name = "logins", schema = "abcd")
public class Logins implements java.io.Serializable {

/**
 * 
 */
private static final long serialVersionUID = 3093763378845870599L;
private Long loginId;
private Users users;
private String userName;
//private String passwordSalt;
private String passwordHash;

public Logins() {
}

public Logins(Long loginId) {
    this.loginId = loginId;
}

public Logins(Long loginId, Users users, String userName,
         String passwordHash) {
    this.loginId = loginId;
    this.users = users;
    this.userName = userName;
    //this.passwordSalt = passwordSalt;
    this.passwordHash = passwordHash;
}

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "login_id", nullable = false)
public Long getLoginId() {
    return this.loginId;
}

public void setLoginId(Long loginId) {
    this.loginId = loginId;
}

@OneToOne(fetch = FetchType.LAZY, optional=false, cascade=CascadeType.ALL)
@JoinColumn(name = "related_user_id")
public Users getUsers() {
    return this.users;
}

public void setUsers(Users users) {
    this.users = users;
}

@Column(name = "user_name")
public String getUserName() {
    return this.userName;
}

public void setUserName(String userName) {
    this.userName = userName;
}


@Column(name = "password_hash", length=60)
public String getPasswordHash() {
    return this.passwordHash;
}

public void setPasswordHash(String passwordHash) {
    this.passwordHash = passwordHash;
}

}

基础表是这样创建的:

abcd.logins

CREATE TABLE abcd.logins
(
login_id bigint,
user_name text COLLATE "default".pg_catalog,
password_salt text COLLATE "default".pg_catalog,
password_hash text COLLATE "default".pg_catalog,
related_user_id bigint
)

abcd.users

CREATE TABLE abcd.users
(
user_id bigint,
first_name text COLLATE "default".pg_catalog,
last_name text COLLATE "default".pg_catalog,
user_name text COLLATE "default".pg_catalog
)

我无法找出数据未保存到数据库中的原因。我什至调用了存储库的flush() 方法,但无济于事。谁能帮帮我?

【问题讨论】:

    标签: java spring-mvc jpa spring-data-jpa


    【解决方案1】:

    如果您不想回滚事务,可以为特定测试添加@Rollback(false)。 就你而言,我希望你已经使用commit 方法提交了事务。

    在你的情况下:

    @Test
    @Rollback(false)
    public void saveOne2One(){
        Logins lgn = new Logins();
        lgn.setUserName("userName");
        lgn.setPasswordHash("dfaskjdfaksjfdalksdf");
    
        Users usr = new Users();
        usr.setFirstName("test");
        usr.setLastName("last");
        usr.setUserName("userName");
    
        usr.setLogins(lgn);
        lgn.setUsers(usr);
        loginsRepository.save(lgn);
        //usersRepository.save(usr);
        loginsRepository.flush();
    }
    

    或者,如果您想在不回滚的情况下为所有测试(类级别)保留数据,那么您可以使用: @TransactionConfiguration(defaultRollback = false)

    【讨论】:

      【解决方案2】:

      您使用 @Transaction 执行 junit 测试,请参阅 Spring Testing Transaction management,但默认情况下,框架将为每个测试创建和回滚事务。

      如果您希望提交事务 - 不寻常,但在您希望特定测试填充或修改数据库时偶尔有用 - 可以指示 TestContext 框架导致事务提交而不是通过 @TransactionConfiguration 和回滚@Rollback 注释。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-06
        • 1970-01-01
        • 2021-07-09
        相关资源
        最近更新 更多