2010-07-07 5 views
12

У меня возникают проблемы с выполнением операции каскадного сохранения в родительском объекте. Когда дочерний объект сохраняется, ссылка (сгенерированный идентификатор) на родительский объект равна нулю. Как я получу это, чтобы это было верно?Как каскад сохраняется с использованием 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); 
    } 
} 
Смежные вопросы