如何在JPA中创建序列而无需直接在Database中创建

时间:2016-03-23 10:40:10

标签: java database oracle hibernate jpa

我正在做一项服务,从源获取数据并使用JPA将它们提取到我的数据库中。 id是使用序列生成的。 我使用以下命令在我的数据库上创建了序列:

CREATE SEQUENCE crm_test_sq_1 MINVALUE 1 MAXVALUE 999999999999999999999999999 START WITH 1 INCREMENT BY 1 CACHE 100 NOCYCLE

但是,我不知道如何直接从我的代码创建序列。有人请帮我解决这个问题。非常感谢你!

我的模型类,modeltest.java:

    @Entity
    @Table(name = "MODEL_TEST")

    @JsonPropertyOrder({ "ID", "CODE", "NAME" })
    @XmlRootElement
    @NamedQueries({
        @NamedQuery(name = "modeltest.getall", query = "SELECT e FROM modelteste"),
        @NamedQuery(name = "modeltest.deleteAll", query = "DELETE FROM modeltest e")})
    public class modeltest implements Serializable {
        private static final long serialVersionUID = 1L;

        @Id
        @GeneratedValue(generator = "crm_test_sq", strategy = GenerationType.SEQUENCE)
        @SequenceGenerator(name = "crm_test_sq", sequenceName = "crm_test_sq",allocationSize=1)
        @Column(name="ID", unique=true, nullable=false, precision=10, scale=0)
        private Long id;

        @Column(name = "CODE")
        private String isocurrencycode;

        @Column(name = "NAME")
        private String currencyname;

        public modeltest() {
        }
//........... getter and setter method

我的dao类,modeltestDao.java

public Boolean saveData() {


//............................................
            getEntityManager().createNamedQuery("modeltest.deleteAll").executeUpdate();

            // i want something like below, but obviously this line of code give me an error
            getEntityManager().createNativeQuery ("CREATE SEQUENCE crm_test_sq_1 MINVALUE 1 MAXVALUE 999999999999999999999999999 START WITH 1 INCREMENT BY 1 CACHE 100 NOCYCLE").executeUpdate();

        /....................
        return true;
    }
编辑:顺便说一下,为什么我想重置序列是每次运行服务(将数据提取到数据库中)时,唯一标识符增加1.例如,第一次运行数据时,id以1开头并以10结束,第二次运行数据时,id以11开始,以20结束。此问题仅在重新启动服务器时停止。

For example:
call saveData() first time
DATA IN TABLE:
ID 1 2 3 4 5
call saveData() second time
DATA IN TABLE:
ID 6 7 8 9 10

其他数据不会改变,但是ID。所以我找到一种方法来解决这个问题,每次运行saveData()

时都会丢弃并重新创建序列

1 个答案:

答案 0 :(得分:4)

您的提案中有代码味道。为什么首先需要避免序列的数据库缓存?序列的重点是生成唯一标识符,因此在应用程序运行时不应重新创建序列。

如果在该方法中创建序列,请想象当多个线程同时调用该方法时会发生什么。

如果您的用例有效,并且您确实需要删除所有这些记录并重置序列,并且您使用的是Oracle 12c,则可以执行以下操作:

entityManager.createNativeQuery(
    "ALTER SEQUENCE crm_test_sq_1 RESTART START WITH 1")
.executeUpdate();