Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.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 如何将Hibernate JPA@SQLInsert与具有默认值的数据库列一起使用_Java_Hibernate_Default_Sql Insert - Fatal编程技术网

Java 如何将Hibernate JPA@SQLInsert与具有默认值的数据库列一起使用

Java 如何将Hibernate JPA@SQLInsert与具有默认值的数据库列一起使用,java,hibernate,default,sql-insert,Java,Hibernate,Default,Sql Insert,我有一个表“groups”,有四列。数据库是postgres,组id列是一个序列号。所以实际上,它是一个整数,默认值是下一个值 我有一个用例,需要使用@SQLInsert(使用普通的persist方法不是一个选项),但我无法让它使用默认值。以下是我所拥有的: @SQLInsert(sql="INSERT INTO groups (group_id, parent_id, group_name, version) VALUES (DEFAULT,?,?,?)") 我将实体属性设置为groupid

我有一个表“groups”,有四列。数据库是postgres,组id列是一个序列号。所以实际上,它是一个整数,默认值是下一个值

我有一个用例,需要使用@SQLInsert(使用普通的persist方法不是一个选项),但我无法让它使用默认值。以下是我所拥有的:

@SQLInsert(sql="INSERT INTO groups (group_id, parent_id, group_name, version) VALUES (DEFAULT,?,?,?)")
我将实体属性设置为groupid和version为null的值,并且正确填充了其他两个。组id在数据库中不可为空,版本可以为空

我得到一个例外:

WARNING: SQL Error: 0, SQLState: 22023
SEVERE: The column index is out of range: 4, number of columns: 3.
SEVERE: Could not synchronize database state with session
如果我直接在数据库中输入以下DML,它会工作:

INSERT INTO groups (group_id, parent_id, group_name, version) VALUES (DEFAULT, 3, 'abcd', null); 

使用@SQLInsert是否有办法让同样的事情发生

如果要保存的类成员不是引用类型,则它们不能保留空值。这可能是与数据库记录同步失败的原因。尝试使用Integer和Double等引用类型,并确保直接插入查询采用默认值

错误消息中的另一件事。默认值可能超出了您在Java中为该列使用的类型的边界。检查默认值是否在范围内。如果为类成员设置的值超出范围,则无法同步该值

编辑:很抱歉,第二部分在这种情况下是不正确的。

所以简短的回答是“不能这样做”。尽管我在很多地方看到过这样的问题,但Hibernate人员并没有提供这个用例

我的解决方案是将Postgres序列与表解耦。也就是说,我删除了从序列中选择nextval并填充两个主键字段之一的默认约束

然后,我使用本机查询(是的,强制取消对数据库的抽象)手动获取nextval,并使用该值手动填充主键字段。它起作用了。这很难理解,但我可能会更频繁地使用它。与使用纯ORM方法相比,对于正在发生的事情,它当然更容易理解。这可以在没有向导帽的情况下进行调试。:)


您希望保存哪些类型的变量以用于版本等?版本是一个很长的过程。这确实适用于直接查询。。。即在数据库上完成一个,而不是通过ORM。
public class...
@PersistenceContext(unitName = "persistence_unit")
private EntityManager em;

...
mymethod(){
...
Query q = em.createNativeQuery("SELECT nextval('groups_group_id_seq')");
BigInteger groupId = (BigInteger)q.getSingleResult();

BigInteger parentId = methodToGetParentId();

GroupsPK gpk = new GroupsPK(groupId, parentId);

Groups grps = new Groups(gpk, "other parameters");

...
}