[英]JPA: Issues persisting 2 entities which have a OneToMany relation
我有2個實體Customer和Address,關系是一個地址可以屬於多個客戶。
下面是客戶類,您可以看到它具有對地址對象的引用,在基礎客戶表中,它是地址的ID。 我省略了getter和setter以及一些簡單的變量。
@Entity
@Table(name = "customer")
public class Customer implements Serializable {
@Id
@GeneratedValue
@Column(name = "customer_id")
private int customerId;
@ManyToOne
@JoinColumn(name = "store_id")
private Store store;
@ManyToOne
@JoinColumn(name = "address_id")
private Address address;
........
}
下面是地址類。
//Address Class
@Entity
@Table(name = "address")
public class Address implements Serializable {
@Id
@GeneratedValue
@Column(name = "address_id")
private int addressId;
@JoinColumn(name = "city_id")
@ManyToOne
private City city;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "address")
@JsonIgnore
List<Customer> customers;
......
}
我試圖在一個電話中保留新客戶和新地址,以像下面這樣保留。 我省略了我設置的一些變量。
Customer cus = new Customer();
Address addr= new Address();
........
cus.setAddress(addr)
List<Customer> cusList= new ArrayList<>();
cusList.add(cus);
addr.setCustomers(cusList);
entityManager.persist(cus)
但是我收到一條錯誤消息,說客戶表中的address_id為null。 我以為JPA會插入新地址,然后插入新客戶,並將地址ID列設置為新地址ID? 我的想法錯了嗎? 還是我在映射中犯了一個錯誤,或者我是如何持久化實體的?
我可以執行此操作的另一種方法是先持久保存地址,然后持久保存客戶,但如果可能的話,希望在單個持久保存中執行。
下面是基礎表。
//Customer Table
CREATE TABLE `customer` (
`customer_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
`store_id` tinyint(3) unsigned NOT NULL,
`first_name` varchar(45) NOT NULL,
`last_name` varchar(45) NOT NULL,
`email` varchar(50) DEFAULT NULL,
`address_id` smallint(5) unsigned NOT NULL,
`active` tinyint(1) NOT NULL DEFAULT '1',
`create_date` datetime NOT NULL,
`last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`customer_id`),
KEY `idx_fk_store_id` (`store_id`),
KEY `idx_fk_address_id` (`address_id`),
KEY `idx_last_name` (`last_name`),
CONSTRAINT `fk_customer_address` FOREIGN KEY (`address_id`) REFERENCES `address` (`address_id`) ON UPDATE CASCADE,
CONSTRAINT `fk_customer_store` FOREIGN KEY (`store_id`) REFERENCES `store` (`store_id`) ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=608 DEFAULT CHARSET=utf8;
/Address Table
CREATE TABLE `address` (
`address_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
`address` varchar(50) NOT NULL,
`address2` varchar(50) DEFAULT NULL,
`district` varchar(20) NOT NULL,
`city_id` smallint(5) unsigned NOT NULL,
`postal_code` varchar(10) DEFAULT NULL,
`phone` varchar(20) NOT NULL,
`last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`address_id`),
KEY `idx_fk_city_id` (`city_id`),
CONSTRAINT `fk_address_city` FOREIGN KEY (`city_id`) REFERENCES `city` (`city_id`) ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=619 DEFAULT CHARSET=utf8;
謝謝。
如果要與Customer
保存新Address
,則需要添加CascadeType.ALL
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "address_id")
private Address address;
並通過這種方式保存所有內容(您無需將客戶添加到地址列表中,因為客戶僅通過外鍵address_id
引用地址即可)
Customer cus = new Customer();
Address addr = new Address();
cus.setAddress(addr)
entityManager.persist(cus)
但這不是一種非常方便的方法,因為地址類似於引用。 因此,通過保存每個客戶來更新參考地址是不尋常的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.