【问题标题】:Auto Increment Using @ Generated使用@生成的自动增量
【发布时间】:2014-01-27 10:18:16
【问题描述】:

我正在为我的 java 企业应用程序使用 sql server 2008R2。 现在,我希望在持久化 bean 的同时,它的 Id 列会自动更新。 我的实体 bean 是:

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

    @Id    
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Basic(optional = false)
    @NotNull
    @Column(name = "BANK_ID")
    private Long bankId;

    @Size(max = 30)
    @Column(name = "BANK_NAME")
    private String bankName;

    @Size(max = 25)
    @Column(name = "IP_ADDRESS")
    private String ipAddress;

    @Size(max = 255)
    @Column(name = "URL")
    private String url;

    @Size(max = 1)
    @Column(name = "FORM_METHOD")
    private String formMethod;

    @Size(max = 1)
    @Column(name = "SECURED")
    private String secured;

    @Column(name = "ACTIVEFLAG")
    private Short activeflag;

    @Column(name = "ENABLED")
    private Short enabled;

    @OneToMany(mappedBy = "bankId")
    private Collection<BankBranchMaster> bankBranchMasterCollection;

    @JoinColumn(name = "PARTNER_ID", referencedColumnName = "UA_ID")
    @ManyToOne
    private PartnerAccount partnerId;
}

但是,当我持久化 bean 时,它会给出约束错误。 我的表创建查询如下:

    CREATE TABLE [dbo].[BANK_MASTER](
[BANK_ID] [numeric](10, 0) IDENTITY(105,1) NOT NULL,
[BANK_NAME] [varchar](30) NULL,
[IP_ADDRESS] [varchar](25) NULL,
[URL] [varchar](255) NULL,
[FORM_METHOD] [varchar](1) NULL,
[SECURED] [varchar](1) NULL,
[PARTNER_ID] [numeric](10, 0) NULL,
[ACTIVEFLAG] [numeric](1, 0) NULL,
[ENABLED] [numeric](1, 0) NULL

【问题讨论】:

  • 确切的错误是:javax.validation.ConstraintViolationException:在回调事件上执行自动 Bean 验证时违反了 Bean 验证约束:'prePersist'
  • 身份类型应该与 ms sql 一起使用...之前我们有 oracle 11g,我们成功地使用了序列和序列生成器来满足我们的自动生成需求

标签: java sql-server-2008 jpa entity-bean


【解决方案1】:

您已将@NotNull 添加到id 属性。因此,这意味着 JPA 将在持久化之前检查此 id 是否为空。但是 id 为空,因为它将在之后由数据库生成。因此,NotNull 注释与它是由身份自动生成的事实直接矛盾。

只需从id 中删除@NotNull 注释。

【讨论】:

  • 有没有比使用身份生成类型更好的方法。由于现在使用身份类型,我必须更新我坚持的所有代码,输入 em.flush(),然后才能使用数据库生成的 Id?
  • 我没用过SQL server,不知道是否支持sequence。您可以使用表生成,它应该适用于任何引擎。
猜你喜欢
  • 2011-01-01
  • 2022-01-09
  • 2018-12-12
  • 1970-01-01
  • 2019-07-26
  • 2015-07-05
  • 1970-01-01
  • 2011-10-10
相关资源
最近更新 更多