Java JPA基于另一个密钥自动生成复合密钥

Java JPA基于另一个密钥自动生成复合密钥,java,hibernate,jpa,hibernate-mapping,Java,Hibernate,Jpa,Hibernate Mapping,地址表具有以下结构,具有复合键,用户id是外键,也是复合PK的一部分: address_ordinal(PK) user_id(PK, FK) 1 1 2 1 1 2 2 2 3 2 1 3

地址表具有以下结构,具有复合键,用户id是外键,也是复合PK的一部分:

address_ordinal(PK)     user_id(PK, FK)
     1                     1
     2                     1
     1                     2
     2                     2
     3                     2
     1                     3
地址类别:

@Entity
public class Address implements Serializable {
    private static final long serialVersionUID = 1L;

    @EmbeddedId
    private AddressPK id;
}

@Embeddable
public class AddressPK implements Serializable {

    @GeneratedValue  //what strategy ?
    @Column(name="address_ordinal")
    private Integer addressOrdinal; // is there any strategy or any other way to auto generate addressOrdinal based on user_id ?

    @Column(name="user_id")
    private Integer userId;
    //equals() and hashCode()
}

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

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "user_id")
    private Long userId;
    //setters and getters
}
在JPA中,是否可以基于另一个字段自动生成复合密钥的一个字段?请参见上面的示例数据,了解它应该如何生成。基本上,它是用户及其多个地址的简单映射

或者我必须手动更新地址表中的复合键吗?

否。JPA规范告诉您提供了哪些策略。使用事件侦听器并在之前填充它persist@BillyFrost您能否详细说明如何实现事件侦听器来填充复合键?目前用于添加新用户及其相应地址的方法是直接的。但要向现有用户添加新地址,我必须先获取max addressOrdinal,然后通过向addressOrdinal添加+1来持久化新地址。