Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.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 @TableGenerator是否可以保存表中最后使用的id而不是下一个可用的id?_Java_Hibernate_Jpa - Fatal编程技术网

Java @TableGenerator是否可以保存表中最后使用的id而不是下一个可用的id?

Java @TableGenerator是否可以保存表中最后使用的id而不是下一个可用的id?,java,hibernate,jpa,Java,Hibernate,Jpa,我需要连接到供应商数据库并插入客户数据。用于生成新客户id的序列表存储上次使用的id(不是下一个可用的id)。我在jpa或hibernate文档中找不到任何指示方法来告诉hibernate将seq表中的id视为最后一次使用,而不是下一次可用(使用@TableGenerator时) 我是否需要编写一个与@TableGenerator行为基本相同的自定义生成器,唯一的区别是处理序列表中的值的方式 我的客户实体定义如下: @Entity public class Customer { @Id

我需要连接到供应商数据库并插入客户数据。用于生成新客户id的序列表存储上次使用的id(不是下一个可用的id)。我在jpa或hibernate文档中找不到任何指示方法来告诉hibernate将seq表中的id视为最后一次使用,而不是下一次可用(使用@TableGenerator时)

我是否需要编写一个与@TableGenerator行为基本相同的自定义生成器,唯一的区别是处理序列表中的值的方式

我的客户实体定义如下:

@Entity
public class Customer {

    @Id
    @TableGenerator(name = "cust_gen", table = "SEQUENCE", pkColumnName = "target",
        pkColumnValue = "customer", valueColumnName = "id", allocationSize = 1)
    @GeneratedValue(strategy = GenerationType.TABLE, generator = "pat_gen")
    public long getCustomer_id() {
          return customer_id;
    }

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

    ...

}

谢谢

我也有同样的问题。修正方法如下: 使用Hibernate org.Hibernate.annotations.GenericGenerator,而不是像这样使用persistance TableGenerator:

import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import org.hibernate.annotations.GenericGenerator;

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

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "names")
@GenericGenerator(name = "names", strategy = "com.ourpackage.SybaseTableGenerator", parameters = {
        @Parameter(name = "table_name", value = "new_key_numbers"),
        @Parameter(name = "value_column_name", value = "key_number"),
        @Parameter(name = "segment_column_name", value = "name"),
        @Parameter(name = "segment_value", value = "names_key") })
@Column(name = "names_id")
private Long id;
并创建您自己的生成器(我使用的名称是com.ourpackage.SybaseTableGenerator):

有点棘手,但它可以工作;)

import java.io.Serializable;

import org.hibernate.engine.spi.SessionImplementor;
import org.hibernate.id.enhanced.TableGenerator;

@SuppressWarnings("UnusedDeclaration")
public class SybaseTableGenerator extends TableGenerator {

    @Override
    public synchronized Serializable generate(SessionImplementor session, Object obj) {
        return (Long) super.generate(session, obj) + 1;
    }
}