Что такое каскадный тип для создания или обновления данных весной jpa - PullRequest
0 голосов
/ 14 мая 2018

Предположим, что Customer и Account имеют отношение один ко многим.Допустим, когда новый банковский счет создает информацию о клиентах, также агрегировать.Для выполнения этой задачи сущность Account также ссылается на объект Customer.

Когда я сохраняю Account и Customer уже существует в таблице, его необходимо обновить или оставить без изменений.Если он не существует, запись клиента должна быть создана.Как это сделать с помощью каскадных типов в JPA?Если это невозможно, как обострить эту проблему?

Субъект счета:

@Entity    
@Table(name = "account")    
public class Account implements Serializable {

    private static final long serialVersionUID = 407923973092266323L;    

    @Id    
    @GeneratedValue(strategy = GenerationType.IDENTITY)    
    @Column(name = "accID")    
    private Integer accountId;        

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

    @ManyToOne(cascade = CascadeType.ALL)    
    @JoinColumn(name = "cus_ID")    
    private Customer customer;
            
    @Temporal(value = TemporalType.DATE)    
    @Column(name = "openDate")    
    private Date createDate;

    // Getters & Setters    
}   

Субъект клиента:

@Entity
@Table(name = "customer")
public class Customer implements Serializable {

    private static final long serialVersionUID = 8149369511517077958L;

    @Id    
    @GeneratedValue(strategy = GenerationType.IDENTITY)    
    @Column(name = "authorID",nullable = false)    
    private Integer cusId;

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

    public Customer(){}

    public Customer(String cusName){this.cusName = cusName}

    // Getter & Setters    
}

AccountDAO:

@Repository    
public class AccountDAO{    

    @Autowired    
    private AccountRepository accrepo;

    public boolean insertAccount(String accType, String cusName, LocalDate createDate) {            

        try{        

            Date date = Date.from(createDate.atStartOfDay(ZoneId.systemDefault()).toInstant());        

            Account acc1 = new Account();    
            acc1.setAccType(accType);    
            acc1.setCreateDate(date);    
            acc1.setCustomer(new Customer(cusName));

            accrepo.save(acc1);

            return true;            

        }catch(Exception ex){ex.printStackTrace();}

    }

    return false;    
}

1 Ответ

0 голосов
/ 14 мая 2018

Действительно, полный ответ - спецификация JPA.

Но в принципе: да JPA может обрабатывать все сценарии: ссылка на объект является новой, неизменной или обновленной.Хотя легко столкнуться с проблемами, если не понимать жизненный цикл сущностей JPA.

В любом случае, он полностью независим от Spring Data и определяется только JPA.Так что найдите хороший учебник JPA и попробуйте разные сценарии.

Чтобы обратиться к коду, который вы разместили в своем обновлении, к вопросу:

cascade = CascadeType.ALL сопоставления позаботится о создании клиента, если его нет.

Если он присутствует, подход по умолчанию - сначала загрузить его и использовать этот объект.Любые изменения в нем будут автоматически сохранены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...