2010-07-07 3 views
12

상위 엔티티에서 계단식 지속 작업을 수행하는 데 문제가 있습니다. 하위 엔티티가 지속되면 상위 엔티티에 대한 참조 (생성 된 ID)는 null입니다. 어떻게 이것을 올바르게 유지할 수 있습니까?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); 
    } 
} 
관련 문제