我有以下场景:
实体命令:
@Entity
public class Command {
@Id
@GeneratedValue
private long id;
@Column(nullable=false)
private Date timeOfExecution;
--constructors, getters, setters...--
扩展命令的实体CmdTest:
@Entity
@SecondaryTable(name = "CmdTest")
public class CmdTest extends Command{
@Column(table = "CmdTest", nullable = false)
private String testParam;
@OneToOne
@JoinColumn(table="CmdTest")
private Citizen citizen;
-- getters, setters, construcotr --
}
实体公民:
@Entity
public class Citizen {
@Id
@GeneratedValue
private long id;
@Column(nullable=false)
private String name;
@OneToOne(mappedBy="citizen")
private CmdTest cmdTest;
-- getters, setters, constructor --
}
如您所见,我在Citizen和CmdTest之间有双向关系。我想先坚持citizen,然后坚持CmdTest。
我正在使用web服务调用MyBean的initTest()方法。MyBean创建一个Citizen和一个CmdTest实例,然后尝试先持久化该Citizen,然后持久化CmdTest。
以下是我的initTest()方法:
public void initTest() {
CmdTest cmd = new CmdTest();
cmd.setTestParam("asd");
cmd.setTimeOfExecution(new Date());
Citizen citizen = new Citizen();
citizen.setName("John Doe");
citizen.setCmdTest(cmd);
cmd.setCitizen(citizen);
em.persist(citizen);
em.persist(cmd);
}
通过在citizen字段上设置@JoinColumn(table=“CmdTest”),我试图告诉JPA将citizen_id外键持久保存在CmdTest表中,如果我注释掉该行,一切正常,但我在命令表中获得了citizen_id外键。
当我放置@JoinColumn(table=“CmdTest”)时,我得到以下异常:notnull属性引用一个临时值-必须在当前操作之前保存临时实例
我知道我可以先持久化CmdTest,将临时CmdTest对象放在持久化上下文中,然后公民和它就可以工作了。我试过了。
但是,我想知道,为什么这不起作用?它是Hibernate还是JPA中的bug?我似乎找不到原因。。。
出现此异常是因为您试图保存引用了cmd
对象的citizen
对象,而没有将cmd
实例持久化到数据库中。
hibernate就是这样工作的,它在数据库中分配和管理对象,当它试图持久化citizen
实例时,它发现它被映射到一个对象(cmd
),当它试图在数据库中构建这个关系时,它将使用id
查找相应的cmd
对象,但是它找不到它也找不到它这就是为什么你会得到异常notnull属性引用一个瞬态值-瞬态实例必须在当前操作之前保存,因为
cmd
没有被持久化。
在尝试保存
citizen
对象之前,您需要将cmd
对象保存到数据库中,您的代码应该是这样的:
public void initTest() {
CmdTest cmd = new CmdTest();
cmd.setTestParam("asd");
cmd.setTimeOfExecution(new Date());
Citizen citizen = new Citizen();
citizen.setName("John Doe");
em.persist(cmd);
citizen.setCmdTest(cmd);
cmd.setCitizen(citizen);
em.persist(citizen);
}
因此,这不是
Hibernate
中的错误,但这是它的工作原理-您不能将对象映射到另一个瞬态
(而不是许可的
)。
问题内容: 我正在学习Java,并且希望将自己的课堂变成可观察的课堂。 但是我已经有了它扩展了另一个类。 我该怎么办? 问题答案: 我建议避免完全使用该类,而应 定义事件特定的侦听器和相应的事件定义 。然后在您的类中定义一个侦听器列表,以及添加和删除侦听器以及向其传播事件的方法(请参见下文)。 强制您使用它来表示事件,然后使用来检查事件类型,这是一种丑陋的非OO方法,并使代码更难以理解。如果查看j
下面是的代码片段,它引用了col1和col2 这种情况有什么解决办法吗? parentPK.java java转换为@embedbable,扩展了parentpk.java 在上面,映射col1和col2是从parentpk.java继承来的,如果在xml映射中的某个ownerclass.java中使用ChildPk作为外键,但在带注释的映射中不能使用,则可以访问它们。 我不能改变我的类的结构,因
我有一个抽象类B,它扩展了另一个抽象类A。在抽象类A中,我有一个受保护的方法转换。我想测试方法foo,它从没有实现的基类调用方法convert。如果无法更改转换方法签名,如何模拟方法转换。 我使用Mockito.spy()调用真正的方法,但转换方法是不可用的嘲弄(通过Mockito.when(...)。 告诉我如何测试方法foo。
我想要继承到应用程序属性的一个属性文件中的属性很少。请告知这是否可能在Spring靴。 当spring boot应用程序加载时,我希望所有5个属性都应该加载并使用@value注释可用。Spring Boot会自动选择classpath中的application.properties,而我没有applicaitoncontext xml或任何属性加载程序代码。 提前道谢。
我发现了这个问题:必须扩展类 A 并实现某个接口的成员变量 并且想知道是否有更好的方法。在方法中将其作为参数传递可以: 但是如何正确地将< code>callback声明为属性呢?这个: 给出语法错误。
该类包含: > 一个无参数构造函数,用于创建具有指定边1、边2和边3的三角形。 所有三个数据字段的访问器方法。 名为getArea()的方法,该方法返回此三角形的区域。 一个名为GetPermission()的方法,返回此三角形的周长。 *一个名为toString()的方法,返回三角形的字符串描述。 有关计算三角形面积的公式,请参见编程练习2.15(java编程入门第9版)。toString()方