Java 一对多Hibernate实体映射:在调用save()之前,必须手动分配此类的ID

Java 一对多Hibernate实体映射:在调用save()之前,必须手动分配此类的ID,java,hibernate,hibernate-mapping,hibernate-4.x,Java,Hibernate,Hibernate Mapping,Hibernate 4.x,我是Hibernate中的一只新蜜蜂,我正在使用PostgreSQL 9.3、JDK 1.7、Hibernate 4.0.2 我正试图保存一个客户,该客户与地址有关系,即一对多关系 保存客户时出现异常: javax.persistence.PersistenceException: org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling

我是Hibernate中的一只新蜜蜂,我正在使用PostgreSQL 9.3、JDK 1.7、Hibernate 4.0.2

我正试图保存一个
客户
,该客户与
地址
有关系,即
一对多
关系

保存
客户时
出现异常:

javax.persistence.PersistenceException: org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save(): com.cust.entities.Address
客户实体:

@Entity
@Table(name="customer")
public class Customer implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @SequenceGenerator(name = "CustomerIdSeq", sequenceName = "c_id_seq", allocationSize = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "CustomerIdSeq")
    @Column (name="c_id")
    private Long cId;

    @Column(name="cname")
    private String cname;

    //bi-directional many-to-one association to Address
    @OneToMany(cascade = CascadeType.ALL)
    @PrimaryKeyJoinColumn(name="c_id")
    private List<Address> address;

    //getters and setters

    }
    @Entity
    @Table(name="address")
    public class Address {

        @Id
        @Column(name="c_id")
        private Long cId;

        @ManyToOne
        @PrimaryKeyJoinColumn(name="c_id", referencedColumnName="c_id")
        private Customer customer; 

        @Column(name="street")
        private String street;

        @Column (name="city")
        private String city;

        //getters and setters
      public void setCustomer(Customer customer) {
           this.customer= customer;
           this.cId= customer.getCId();
       }

        }

我尝试了一些类似于

的方法,我怀疑在调用
save()
时地址记录没有ID

该类中缺少
@GeneratedValue
标记,如果未指定,则默认为“assigned”值

如果在调用
save()
之前没有为
Address.cId
赋值,您将看到此问题。如果这不是问题的原因,请发布所有相关代码


<>编辑:查看您的表结构,地址在架构设计中应该有它自己的ID,并且有一个外键(FK)引用到“代码>客户ID ./COD> .< /P> < p>对前面的答案形成注释,并且从您现有的表结构中,您可能想将映射地址看作是可嵌入的而不是实体:

这类似于OneToMany,只是目标对象是 可嵌入而不是实体。这允许收集简单的 对象易于定义,而不需要简单的对象 定义一个Id或多个反向映射。ElementCollection也可以 重写映射或其集合的表,以便 多个实体引用同一个可嵌入类,但每个实体都有 将其从属对象存储在单独的表中

映射将如下所示。地址本身没有持久性标识,只能作为实体的一部分存在-当前为客户,但没有理由不能将其用于需要地址的其他实体

客户:

@Entity
@Table(name="customer")
public class Customer implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @SequenceGenerator(name = "CustomerIdSeq", sequenceName = "c_id_seq", allocationSize = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "CustomerIdSeq")
    @Column (name="c_id")
    private Long cId;

    @Column(name="cname")
    private String cname;

    @ElementCollection
    @CollectionTable(name = "customer_address", joinColumns = @JoinColumn(name = "c_id")
    private List<Address> addresses;
}

谢谢你的回复:)。现在考虑上面定义的设计,地址实体不能使用客户使用的相同密钥。我知道这种设计不是一种好的实践,是的,我们没有任何@Annotation来实现客户和地址之间的这种一对多关系,如果地址没有自己的ID,使用hibernate就没有什么意义(我甚至不确定这是否可能)。既然Hibernate使用每个对象的ID在缓存等中定位它,那么为什么我们可以在一对一映射中这样做,就像它在
Has-a
关系中的一些受限功能一样。如果我认为Phone有OwnerID,Address有OwnerID,PhonePK有一个“type”ID,请指导我,从我在该链接上看到的所有示例代码来看,在调用save()之前,所有ID变量都被赋值。您的问题是,您试图使用分配的ID,而在调用save()之前没有分配值。查看链接的最底部,了解地址没有PK(在运行时生成ID)的想法。这就是我要寻找的。我会试试这个,然后再给你更新。谢谢你的回复:)@AlanHay请你看看这个问题好吗?
@Embeddable
public class Address {

    @Column(name="street")
    private String street;

    @Column (name="city")
    private String city;
}