Java 为什么Hibernate不允许动态输入字符串作为表的主键?
我有三个实体,比如A、B和C。A包含B和C的多个实例。B和C的主键是字符串字段,在运行时填充。代码如下: A类: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
@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,将您试图持久化实体的代码以及异常的完整堆栈跟踪发布出来。