Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.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不允许动态输入字符串作为表的主键?_Java_Hibernate - Fatal编程技术网

Java 为什么Hibernate不允许动态输入字符串作为表的主键?

Java 为什么Hibernate不允许动态输入字符串作为表的主键?,java,hibernate,Java,Hibernate,我有三个实体,比如A、B和C。A包含B和C的多个实例。B和C的主键是字符串字段,在运行时填充。代码如下: A类: @Entity public class A { private int id; private B[] bSet = null; private C[] cSet = null; @Id @GeneratedValue(strategy = GenerationType.AUTO) public int getId() {return id;} @OneToMa

我有三个实体,比如A、B和C。A包含B和C的多个实例。B和C的主键是字符串字段,在运行时填充。代码如下:

A类:

@Entity
public class A
{
 private int id;
 private B[] bSet = null;
 private C[] cSet = null;

 @Id
 @GeneratedValue(strategy = GenerationType.AUTO)
 public int getId()
 {return id;}

 @OneToMany(cascade = CascadeType.ALL, mappedBy = "a")
 @OrderColumn(name = "bIndex")
 public B[] getBset()
 {return bSet;}

 @OneToMany(cascade = CascadeType.ALL, mappedBy = "a")
 @OrderColumn(name = "cIndex")
 public C[] getCset()
 {return cSet;}
}
B类:

@Entity
public class B
{
 private String bId;
 private A a;

 @Id
 public String getBId()
 {return bId;}

 @ManyToOne(cascade = CascadeType.ALL)
 public A getA(A a)
 {return a;}
}
C类:

@Entity
public class C
{
 private String cId;
 private A a;

 @Id
 public String getCId()
 {return cId;}

 @ManyToOne(cascade = CascadeType.ALL)
 public A getA(A a)
 {return a;}
}
如果我试图在我的应用程序中持久化一个B实体,Hibernate不会进行插入,正如我在启用Hibernate日志记录后看到的那样。它正在尝试更新,并引发此异常

org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
这个问题在任何地方都没有得到令人满意的回答。我试过了,然后。正如他们所说,Hibernate在保存时希望主id为null,如果是其他内容,则会更新行,并抛出此异常。但是我需要插入这些字符串作为主键的行。那我能做些什么呢?请帮我做这个

其他信息


我想我正在打一场失败的战斗。这似乎是Hibernate本身的一个bug,在Hibernate开发人员解决它之前,我们不能这样做。看看。

你能试着分别保存B和C并查看吗?字符串主键不是这里的问题。看起来与映射或锁定模式有关不幸的是,我需要为保存的每个B和C保留a的引用。事实上,这是我在大约一个小时前发布的另一个问题的主题。所以我不能单独保存B或C。它们必须一起工作。你能试着用list替换B[]吗。Hibernate只支持set、list、map和bag。这可能是个问题。@Zeus,简单的数组很好用。问题肯定不在那里。当我将字符串主键替换为一个自动生成的int-one伪主键时,B的所有行都会被持久化,没有任何问题。@abhishek,将您试图持久化实体的代码以及异常的完整堆栈跟踪发布出来。