Spring JPA 向子项添加其他条目 Table
Spring JPA Add Additional Entries To Child Table
感觉好像已经有了答案,但我浏览了各种帖子,但仍在苦苦挣扎。
我正在学习如何将 JPA 与 Spring Boot 一起使用,并且正在专门努力理解一对多关系。手头的问题是我有一个客户实体,客户可能有多个与之关联的电子邮件地址,因此我们可以联系客户的多个人。这给了我这些模型:
@AllArgsConstructor
@NoArgsConstructor
@Data
@ToString
@Entity
@Table(name = "customer")
public class Customer {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
private String customerName;
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@LazyCollection(LazyCollectionOption.FALSE)
@JoinColumn(name = "email_address_id")
private List<EMailAddress> emailAddress = new ArrayList<>();
private int brandId;
private boolean shipmentReport;
private boolean salesReport;
}
然后我有了 EMailAddress 模型:
@AllArgsConstructor
@NoArgsConstructor
@Data
@ToString
@Entity
@Table(name = "e_mail_address")
public class EMailAddress {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
private String emailAddress;
}
这是我的 CustomerRepository:
public interface CustomerRepository extends JpaRepository<Customer, Integer> {
}
现在,我可以添加客户,并拥有与该客户关联的电子邮件地址:
List<EMailAddress> eMailAddresses = new ArrayList<>();
EMailAddress eMailAddress = new EMailAddress();
eMailAddress.setEmailAddress("someemail@gmail.com");
eMailAddresses.add(eMailAddress);
Customer customer = new Customer();
customer.setCustomerName("Company A");
customer.setBrandId(1);
customer.setSalesReport(false);
customer.setShipmentReport(true);
customer.setEmailAddress(eMailAddresses);
repo.save(customer);
然后愉快地添加到数据库中。
问题是,如果我想为该客户添加另一个电子邮件地址,我该怎么做?我已经尝试使用 getOne 从存储库中检索客户,然后获取当前的电子邮件地址并添加到该地址,但是如果我随后尝试保存该客户,我会收到同一实体的多个表示错误。
我想也许我需要添加一个 EMail 地址存储库,然后通过它添加新条目(假设我可以得到 email_address_id),但我在上面也画了一个空白。
感谢任何指导。
到目前为止,这是我尝试添加新电子邮件的方式:
Customer tempCustomer = repo.getOne(1);
List<EMailAddress> curentEmails = tempCustomer.getEmailAddress();
eMailAddress.setEmailAddress("anotheremail@gmail.com");
curentEmails.add(eMailAddress);
eMailAddress.setEmailAddress("athirdemail@yahoo.co.uk");
curentEmails.add(eMailAddress);
tempCustomer.setEmailAddress(curentEmails);
repo.save(tempCustomer);
要将新的 EmailAddress 实体添加到您的 Customer 实体,您只需调用 findById 或其他查找 spring-data 方法,然后创建一个新的 EmailAddress 实例以附加到 Customer 实体的 EmailAddress 集合中。如果您 post 这里有一些堆栈跟踪异常,那就太好了,这样我们可以提供更多帮助!
// will retrieve your customer entity
Customer customer = customerRepository.getOne(10)
// get email collection and add new EmailAddress instance
customer.getEmailAddresses().add(new EmailAddress(10,"email@teste.com")
// save and flush email data on table
customerRepository.saveAndFlush(customer);
感觉好像已经有了答案,但我浏览了各种帖子,但仍在苦苦挣扎。
我正在学习如何将 JPA 与 Spring Boot 一起使用,并且正在专门努力理解一对多关系。手头的问题是我有一个客户实体,客户可能有多个与之关联的电子邮件地址,因此我们可以联系客户的多个人。这给了我这些模型:
@AllArgsConstructor
@NoArgsConstructor
@Data
@ToString
@Entity
@Table(name = "customer")
public class Customer {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
private String customerName;
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@LazyCollection(LazyCollectionOption.FALSE)
@JoinColumn(name = "email_address_id")
private List<EMailAddress> emailAddress = new ArrayList<>();
private int brandId;
private boolean shipmentReport;
private boolean salesReport;
}
然后我有了 EMailAddress 模型:
@AllArgsConstructor
@NoArgsConstructor
@Data
@ToString
@Entity
@Table(name = "e_mail_address")
public class EMailAddress {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
private String emailAddress;
}
这是我的 CustomerRepository:
public interface CustomerRepository extends JpaRepository<Customer, Integer> {
}
现在,我可以添加客户,并拥有与该客户关联的电子邮件地址:
List<EMailAddress> eMailAddresses = new ArrayList<>();
EMailAddress eMailAddress = new EMailAddress();
eMailAddress.setEmailAddress("someemail@gmail.com");
eMailAddresses.add(eMailAddress);
Customer customer = new Customer();
customer.setCustomerName("Company A");
customer.setBrandId(1);
customer.setSalesReport(false);
customer.setShipmentReport(true);
customer.setEmailAddress(eMailAddresses);
repo.save(customer);
然后愉快地添加到数据库中。
问题是,如果我想为该客户添加另一个电子邮件地址,我该怎么做?我已经尝试使用 getOne 从存储库中检索客户,然后获取当前的电子邮件地址并添加到该地址,但是如果我随后尝试保存该客户,我会收到同一实体的多个表示错误。
我想也许我需要添加一个 EMail 地址存储库,然后通过它添加新条目(假设我可以得到 email_address_id),但我在上面也画了一个空白。
感谢任何指导。
到目前为止,这是我尝试添加新电子邮件的方式:
Customer tempCustomer = repo.getOne(1);
List<EMailAddress> curentEmails = tempCustomer.getEmailAddress();
eMailAddress.setEmailAddress("anotheremail@gmail.com");
curentEmails.add(eMailAddress);
eMailAddress.setEmailAddress("athirdemail@yahoo.co.uk");
curentEmails.add(eMailAddress);
tempCustomer.setEmailAddress(curentEmails);
repo.save(tempCustomer);
要将新的 EmailAddress 实体添加到您的 Customer 实体,您只需调用 findById 或其他查找 spring-data 方法,然后创建一个新的 EmailAddress 实例以附加到 Customer 实体的 EmailAddress 集合中。如果您 post 这里有一些堆栈跟踪异常,那就太好了,这样我们可以提供更多帮助!
// will retrieve your customer entity
Customer customer = customerRepository.getOne(10)
// get email collection and add new EmailAddress instance
customer.getEmailAddresses().add(new EmailAddress(10,"email@teste.com")
// save and flush email data on table
customerRepository.saveAndFlush(customer);