gpt4 book ai didi

mysql - 如何使用 JPA/EclipseLink 级联持久化

转载 作者:IT老高 更新时间:2023-10-29 00:12:08 24 4
gpt4 key购买 nike

我在对父实体执行级联持久化操作时遇到问题。当持久化子实体时,对父实体的引用(生成的 id)为空。我怎样才能让它正确地持续存在?

实体:

@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 表和插入:

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 的内容。由于您的关联是双向的,您是否在此方法中设置“链接的两侧”?像这样的:

@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);
}
}

关于mysql - 如何使用 JPA/EclipseLink 级联持久化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3197667/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com