2010-07-07 3 views
12

Je rencontre des problèmes lors de l'exécution d'une opération de conservation en cascade sur une entité parente. Lorsque l'entité enfant est persistante, la référence (l'ID généré) à l'entité parente est null. Comment pourrais-je obtenir que cela persiste correctement?Comment mettre en cascade la persistance à l'aide de JPA/EclipseLink

Entités:

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

     ... 
} 

Service:

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

} 

tables MySQL &: 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); 

Répondre

13

Malheureusement, vous n'êtes pas montrer le contenu de addAddress. Puisque votre association est bidirectionnelle, définissez-vous les "deux côtés du lien" dans cette méthode? Quelque chose comme ceci:

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