【问题标题】:How to cascade persist using JPA/EclipseLink如何使用 JPA/EclipseLink 级联持久化
【发布时间】:2011-03-12 23:28:30
【问题描述】:

我在对父实体执行级联持久化操作时遇到问题。当子实体被持久化时,对父实体的引用(生成的 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);

【问题讨论】:

    标签: mysql jpa eclipselink


    【解决方案1】:

    很遗憾,您没有显示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);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2012-07-13
      • 2018-05-15
      • 2013-05-15
      • 2014-10-22
      • 2010-12-25
      • 2011-11-23
      • 2014-02-13
      • 2013-08-24
      • 2015-11-02
      相关资源
      最近更新 更多