Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA中实体序列生成器_Java_Mysql_Jpa - Fatal编程技术网

Java JPA中实体序列生成器

Java JPA中实体序列生成器,java,mysql,jpa,Java,Mysql,Jpa,我正试图用JPA在MySQL中创建一个顺序生成器字段,“prod_generator_id”必须以“1”开头。 例如: 这是我的java对象: //this one is working fine, the id is unique... @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "pro_id") private Long id; //here is the problem, must st

我正试图用JPA在MySQL中创建一个顺序生成器字段,“prod_generator_id”必须以“1”开头。 例如:

这是我的java对象:

//this one is working fine, the id is unique...
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "pro_id")
private Long id;

//here is the problem, must start in "1" by entity
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator="seq")
@SequenceGenerator(name="seq", sequenceName="pro_id_tenancy", initialValue=1, allocationSize=1)
@Column(name = "pro_id_tenancy")
private Long idTenancyProjeto;
我使用的是spring boot,但当我保存对象时,IDTenancProjeto将变为null


我找到的最简单的解决方案是:只需计算该公司的产品数量,然后在我的产品中添加+1即可。save()仅此而已。谢谢大家。

据我所知,您希望该公司的所有产品编号为1到n

映射这一点的可能性取决于您使用的JPA提供商

为了在Hibernate中实现这一点(从4.3版开始),您可以将索引集合(通过
@OneToMany
)与
@listinexbase
结合使用(请参阅)

示例代码:

@Entity
class Corporation {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "corp_id")
    private Long id;

    @OneToMany(mappedBy="corporation")
    @OrderColumn(name="prod_generator_id")
    @ListIndexBase(1)
    private List<Product> products;

    public List<Product> getProducts() { 
         return products;
    }

    public void setProducts(List<Product> products) {
       this.products = products;
    }
}

@Entity
class Product {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "prod_id")
    private Long id;

    @ManyToOne
    @JoinColumn(
        name = "corp_id", 
        referencedColumnName = "corp_id"
    )
    private Corporation corporation;

    public Corporation getCorporation() {
        return corporation;
    }

    public void setCorporation(Corporation corporation) {
        this.corporation = corporation;
    }
}
解决方案:


作为最简单的解决方案,我制作了另一个表,用于合计,在保存之前,我得到了值e add+1。

检查我是否用更多信息更新了问题。为了使这个问题看起来完整,我希望至少有两个类声明(公司和产品)。此外,“保存对象”的代码示例也不错。也许您应该向OP提及这是什么
@listinexbase
,因为它不是JPA的一部分,因此应用程序是不可移植的。此外,OP没有说明使用了哪个JPA提供商,因此您必须具备一些先见之明。。。
@Entity
class Corporation {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "corp_id")
    private Long id;

    @OneToMany(mappedBy="corporation", cascade = CascadeType.ALL)
    @OrderBy("prodGeneratorId")
    private List<Product> products;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public List<Product> getProducts() {
         return products;
    }

    public void setProducts(List<Product> products) {
       this.products = products;
    }
}

@Entity
class Product {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "prod_id")
    private Long id;

    @Column(name = "prod_generator_id")
    private Integer prodGeneratorId;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    @ManyToOne
    @JoinColumn(
        name = "corp_id",
        referencedColumnName = "corp_id"
    )
    private Corporation corporation;

    public Corporation getCorporation() {
        return corporation;
    }

    public void setCorporation(Corporation corporation) {
        this.corporation = corporation;
    }

    public Integer getProdGeneratorId() {
        return prodGeneratorId;
    }

    private void setProdGeneratorId(Integer prodGeneratorId) {
        this.prodGeneratorId = prodGeneratorId;
    }

    @PrePersist
    @PreUpdate
    public void updateProdGeneratorId() {
        setProdGeneratorId(getCorporation().getProducts().indexOf(this) + 1);
    }
}