【问题标题】:Insert data to multiple tables in spring jpa在spring jpa中将数据插入多个表
【发布时间】:2020-12-20 05:04:05
【问题描述】:

我有两个表,usertransaction。其中one user 可以有many transactions。所以,每次我create new user,他们都会自动生成new transactiontransaction typeSEND MONEY。但我不明白如何在 Spring JPA 中编写它。请查看我的代码并帮助我。

用户.java

@Entity
@Table(name = "user")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private long id;

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

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

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

    @Column(name = "money")
    private int money;
    
    //Getter Setter Constructor
}

Transaction.java

@Entity
@Table(name = "transaction")
public class Transaction {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id_trans")
    private long id_trans;

    @Column(name = "id_user")
    private long id_user;

    @Column(name = "transaction_date")
    private Timestamp transaction_date;

    @Column(name = "type") //Default set as "SEND MONEY"
    private String type;

    @Column(name = "trans_money") //From money in User.class
    private int trans_money;


    //Getter Setter Constructor
}

我知道我应该在我的 UserDAO.java 中做点什么,但我仍然不知道如何从 body 发送数据并将其拆分(?)成两个对象(user 和 @ 987654329@,所以我可以将其持久化到 UserDAO)。

【问题讨论】:

  • 你有机会尝试答案吗?

标签: java mysql spring jpa


【解决方案1】:

首先要写好User和Transaction的关系。

@Entity
@Table(name = "user")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private long id;

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

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

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

    @Column(name = "money")
    private int money;

    @OneToMany(mappedBy = "user", cascade = CascadeType.ALL)
    private Set<Transaction> transactions = new HashSet<>();
    
    //Getter Setter Constructor
}


@Entity
@Table(name = "transaction")
public class Transaction {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id_trans")
    private long id_trans;

    @Column(name = "id_user")
    private long id_user;

    @Column(name = "transaction_date")
    private Timestamp transaction_date;

    @Column(name = "type") //Default set as "SEND MONEY"
    private String type;

    @Column(name = "trans_money") //From money in User.class
    private int trans_money;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(referencedColumnName = "id")
    private User user;

    //Getter Setter Constructor
}

然后你必须为用户创建 JPA 存储库接口

@Repository
public interface UserRepo extends CrudRepository <User, Long> {
}

然后在一个服务中,你可以做如下操作

@Service
public class UserService {
    private UserRepo userRepo;

    @Autowired
    MealService(UserRepo userRepo){
        this.userRepo = userRepo;
    }

    public void CreateNewUser(){
        User user = new User();
        // set its values

        Transaction transaction = new Transaction();
        transaction.setType("SEND MONEY");
        // set other values

        user.getTransactions().add(transaction);

        userRepo.save(user);
    }
}

【讨论】:

    【解决方案2】:

    查看提到的@Entity 类,在我看来,TransactionUser 之间存在@ManyToOne 关联,这在实体关系建模/映射中未捕获。

    请考虑在您的Transaction 实体中进行如下建模,

    @Entity
    @Table(name = "transaction")
    public class Transaction {
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        @Column(name = "id_trans")
        private long id_trans;
    
        @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.REFRESH, CascadeType.MERGE}, fetch = FetchType.LAZY)
        @JoinColumn(name = "user_id")
        private User user;
    
        @Column(name = "transaction_date")
        private Timestamp transaction_date;
    
        @Column(name = "type") //Default set as "SEND MONEY"
        private String type;
    
        @Column(name = "trans_money") //From money in User.class
        private int trans_money;
    
    
        //Getter Setter Constructor
    }
    

    完成此操作后,您可以为 TransactionUser 创建 JPA 存储库类,并在构建实例后简单地使用 save 方法在事务中执行您想要的操作。更多关于 Spring Data JPA 中的事务here

    public interface TransactionRepository extends JpaRepository<Transaction, Long> {
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-14
      • 2019-04-19
      • 2016-09-04
      • 2020-08-14
      • 2021-03-10
      • 2021-01-05
      • 1970-01-01
      相关资源
      最近更新 更多