min*_*inh 5 java database oracle hibernate jpa
我正在做一项服务,该服务从源获取数据并使用 JPA 将它们提取到我的数据库中。id是通过使用sequence生成的。我使用以下命令在数据库上创建了序列:
CREATE SEQUENCE crm_test_sq_1 MINVALUE 1 MAXVALUE 999999999999999999999999999 START WITH 1 INCREMENT BY 1 CACHE 100 NOCYCLE
Run Code Online (Sandbox Code Playgroud)
但是,我不知道如何直接从我的代码创建序列。
谁能帮我解决这个问题吗?太感谢了!
我的模型类 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
Run Code Online (Sandbox Code Playgroud)
我的 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;
}
Run Code Online (Sandbox Code Playgroud)
编辑:顺便说一句,为什么我想重置序列是每次我运行服务(将数据提取到数据库中)时,唯一标识符都会增加1。例如,我第一次运行数据时,id以1开头并以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
Run Code Online (Sandbox Code Playgroud)
其他数据不变,只是id变了。所以我找到了解决这个问题的方法,即每次运行 saveData() 时删除并重新创建序列
你的提案中有代码味道。为什么首先需要避免序列的数据库缓存?序列的全部要点是生成唯一标识符,因此您不应在应用程序运行时重新创建序列。
如果您在该方法中创建序列,请想象当多个线程同时调用该方法时会发生什么。
如果您的用例有效,并且您确实需要删除所有这些记录并重置序列,并且您使用的是 Oracle 12c,则可以执行以下操作:
entityManager.createNativeQuery(
"ALTER SEQUENCE crm_test_sq_1 RESTART START WITH 1")
.executeUpdate();
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
10316 次 |
最近记录: |