【问题标题】:How to use the @TableGenerator annotation for a non-PK id如何为非 PK id 使用 @TableGenerator 注释
【发布时间】:2012-03-28 19:17:09
【问题描述】:

这是 JPA 实体模式的摘录



    @Entity
    @Table(name="customer")
    public class Customer implements Serializable {

        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        @Column(name="customer_id")
        private Long id;

        @ManyToOne
        @JoinColumn(name="company_id",nullable=false)
        private Company company;

    //...

    }

    @Entity
    @Table(name="company")
    public class Company implements Serializable {

        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        @Column(name="company_id")
        private Long id;

    //...

    }

    @Entity
    @Table(name="order_header")
    public class OrderHeader implements Serializable {

        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        @Column(name="order_id")
        private Long id;


        @ManyToOne
        @JoinColumn(name="customer_id",nullable=false)
        private Customer customer;

        private Long internalCompanyOrderId;

    //...

    }

我需要为每个 Company_id 检索一个唯一的 internalCompanyOrderId 序列。这意味着尽管订单 PK 将是“order_id”,但我需要每个公司的“内部”order_id。

【问题讨论】:

    标签: java jakarta-ee entity jpa-2.0 entity-relationship


    【解决方案1】:

    您的代码示例中没有出现@TableGenerator。我假设你想用@GeneratedValue 产生价值。

    关于 JPA 2.0,根据规范,您不能将 @GeneratedValue 用于不属于主键的字段:

    GeneratedValue 注释可以应用于主键属性 或实体的字段或映射的超类与 Id 结合 注解。 [97]
    ...
    [97] 便携式应用程序不应使用 其他持久字段或属性上的 GeneratedValue 注释。

    【讨论】:

    • 好的,很清楚。感谢你的回复。所以现在的问题是如何获取序列并避免并发问题(“internalCompanyOrderId”值的两倍或更多相同)。您可以提出一个可行的解决方案吗?也许是自定义序列生成器?
    猜你喜欢
    • 1970-01-01
    • 2012-11-21
    • 2012-04-11
    • 1970-01-01
    • 1970-01-01
    • 2013-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多