簡體   English   中英

無法提交 JPA 事務:嵌套異常是 javax.persistence.RollbackException:提交事務時出錯

[英]Could not commit JPA transaction: nested exception is javax.persistence.RollbackException: Error while committing the transaction

我查看了多個類似的實例(如下所述),其中錯誤幾乎相同,但我發現我的場景有點不同。 有人可以幫我嗎?

在我的例子中,確切的異常消息是 -

Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Error while committing the transaction

當我嘗試保存與User存在@ManyToOne關系的MarriagePerson實體時,會出現此問題。 請在下面找到實體及其關系 -

用戶.java

@Entity
@Table(name = "MAIN_USER")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "user")
    private Collection<MarriagePerson> marriagePerson = new ArrayList<MarriagePerson>();

    @NotEmpty(message = "Name can not be empty")
    @Size(min = 2, max = 20, message = "Name must be between 2 and 20 characters long")
    @Column(name = "first_name")
    private String firstName;

    @Column(name = "middle_name")
    private String middleName;

    @Column(name = "last_name")
    private String lastName;

    @NotEmpty(message = "Email can not be empty")
    @Size(min = 5, message = "Email must be more than 5 characters long")
    @Column(name = "email", unique = true)
    private String email;

    @Column(name = "alternateEmail")
    private String alternateEmail;

    @NotEmpty(message = "Mobile can not be empty")
    @Size(min = 10, max = 10, message = "Mobile must be 10 digits long")
    @Column(name = "mobile", unique = true)
    private String mobile;

    @Column(name = "alternate_mobile")
    private String alternateMobile;

    @NotEmpty(message = "Password can not be empty")
    @Size(min = 6, message = "Password must be more than 6 characters long")
    @Column(name = "password")
    private String password;
}

MarriagePerson.java

@Entity
@Table(name = "MARRIAGE_PERSON")
public class MarriagePerson {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @ManyToOne
    @JoinColumn(columnDefinition = "user_id")
    private User user;

    @NotEmpty
    @Column(name = "gender")
    private String gender;

    @NotEmpty(message = "Name can not be empty")
    @Size(min = 2, max = 20, message = "Name must be between 2 and 20 characters long")
    @Column(name = "firstName")
    private String firstName;
}

這就是我正在做的 -

  • 我在我的postgres數據庫中保存了一個User
  • 現在我正在嘗試為同一個User保存MarriagePerson ,然后捕獲到上述異常。

請在下面找到UserSeriveMarriagePersonService -

UserService.java

@Service
public class UserService implements IUserService {

    @Autowired
    private IUserRepository userRepository;
    
    @Override
    public User save(User user) {
        return userRepository.save(user);
    }
}

MarriagePerson.java

@Service
public class MarriagePersonService implements IMarriagePersonService {

    @Autowired
    private IMarriagePersonRepository marriagePersonRepository;

    @Override
    public MarriagePerson save(MarriagePerson marriagePerson) {
        userRepository.findById(userId).map(user -> {
            marriagePerson.setUser(user);
            return marriagePersonRepository.save(marriagePerson);
        });
        return marriagePerson;
    }
}

在此行捕獲異常marriagePersonRepository.save(marriagePerson); 對於以下提到的請求有效負載-

MarriagePerson 負載

{
  "firstName": "Name",
  "gender": "Male"
}

保存的用戶數據如下(我們正在嘗試更新 MarriagePerson)

{
    "firstName": "string",
    "middleName": "string",
    "lastName": "string",
    "email": "string@string.com",
    "alternateEmail": "string1@string.com",
    "mobile": "0123456789",
    "alternateMobile": "0123456789",
    "password": "string",
    "marriagePerson": []
}

編輯

存儲庫接口是 -

IMarriagePersonRepository.java

@Repository
public interface IMarriagePersonRepository
        extends JpaRepository<MarriagePerson, Long>, JpaSpecificationExecutor<MarriagePerson> {
    List<MarriagePerson> findAll();
}

IUserRepository.java

@Repository
public interface IUserRepository extends JpaRepository<User, Long> {
    public User findByMobile(String mobile);
    User findByMobileAndEmail(String mobile, String email);
}

先感謝您。

我有同樣的問題,異常消息沒有幫助。 就我而言,我試圖將編碼后的密碼保存到大小為 20 的列中。

@Size(max = 20) // not enough for an encoded password
private String password;

但是編碼后的密碼長度不止於此,所以一旦我將實體中列的大小增加到 120,它就很有魅力了。

因此,我建議遇到此問題的任何人仔細檢查您嘗試保存在數據庫表中的數據長度。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM