2010-07-07 84 views
12

我在對父實體執行級聯保留操作時遇到問題。當子實體持久化時,對父實體的引用(生成的id)爲空。我如何得到這個堅持正確?如何使用JPA/EclipseLink級聯持久保存

實體:

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

回答

13

可悲的是,你不顯示的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); 
    } 
}