如何使用JPA/EclipseLink进行级联持久化 [英] How to cascade persist using JPA/EclipseLink
本文介绍了如何使用JPA/EclipseLink进行级联持久化的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我在对父实体执行级联持久化操作时遇到问题.当子实体持久存在时,对父实体的引用(生成的ID)为null.我如何才能使它正确持续?
I am having problems performing a cascade persist operation on a parent entity. When the child entity is persisted, the reference (generated id) to the parent entity is null. How would I get this to persist correctly?
实体:
@Entity
public class Contact {
@Id @GeneratedValue(strategy=GenerationType.TABLE, generator="contact_gen")
@TableGenerator(name="contact_gen",
table="id_gen", pkColumnName="gen_name",
valueColumnName="gen_val", pkColumnValue="cont_gen")
@Column(name="contact_id")
private Long id;
@Column(name="name")
private String name;
@OneToMany(mappedBy="contact", cascade=CascadeType.PERSIST)
private List<Address> addresses = new ArrayList<Address>();
public void addAddress(Address address) {
addresses.add(address);
}
...
}
@Entity
public class Address {
@Id @GeneratedValue(strategy=GenerationType.TABLE, generator="address_gen")
@TableGenerator(name="address_gen",
table="id_gen", pkColumnName="gen_name",
valueColumnName="gen_val", pkColumnValue="addr_gen")
@Column(name="address_id")
private Long id;
@Column(name="full_address")
private String fullAddress;
@ManyToOne
@JoinColumn(name="contact_id")
private Contact contact;
...
}
服务:
@Stateless
public class ContactService {
@PersistenceContext
private EntityManager em;
public void createContact() {
Contact contact = new Contact();
contact.setName("Michael Scott");
contact.addAddress(new Address("1725 Slough Avenue");
em.persist(contact);
}
}
MySQL Tables&插入:
MySQL Tables & Inserts:
CREATE TABLE `contact` (
`contact_id` int(11) NOT NULL,
`name` varchar(45) NOT NULL
PRIMARY KEY (`contact_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE `address` (
`address_id` int(11) NOT NULL,
`full_address` varchar(100) NOT NULL,
`contact_id` int(11) NOT NULL,
PRIMARY KEY (`address_id`),
KEY `FK_ADDRESS_contact_id` (`contact_id`),
CONSTRAINT `FK_ADDRESS_contact_id` FOREIGN KEY (`contact_id`) REFERENCES `contact` (`contact_id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE id_gen (
gen_name VARCHAR(80),
gen_val INT,
PRIMARY KEY (gen_name)
);
INSERT INTO id_gen (gen_name, gen_val) VALUES ('cont_gen', 0);
INSERT INTO id_gen (gen_name, gen_val) VALUES ('addr_gen', 0);
推荐答案
不幸的是,您没有显示addAddress
的内容.由于您的关联是双向的,因此您是否要在这种方法中设置链接双方"?像这样:
Sadly, you're not showing the content of addAddress
. Since your association is bidirectional, are you setting "both sides of the link" in this method? Something like this:
@Entity
public class Contact {
...
@OneToMany(mappedBy="contact", cascade=CascadeType.PERSIST)
private List<Address> addresses = new ArrayList<Address>();
public void addToAddresses(Address address) {
address.setContact(this);
this.addresses.add(address);
}
}
这篇关于如何使用JPA/EclipseLink进行级联持久化的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文