我使用的是PlayFramework 2.3,我有以下类:
MyEntity.java:
@Entity(name = "myentity")
public class MyEntity extends Model {
@Id
@GeneratedValue
public long id;
@OneToOne(cascade = CascadeType.ALL, optional = true)
@JoinColumn(name = "actual_version_id", nullable = true)
public Version actualVersion;
@OneToOne(html" target="_blank">optional = true)
@JoinColumn(name = "next_version_id", nullable = true)
public Version nextVersion;
...
}
Version.java
@Entity(name = "version")
public class Version extends Model {
@Id
@GeneratedValue
public long id;
@OneToOne
@JoinColumn(name = "entity_id", nullable = false)
public MyEntity entity;
...
}
当我想为实体创建一个新版本时,我通过分离复制它,将id设置为0,并按如下方式持久化:
public Version clone(){
JPA.em().detach(this);
this.id = 0;
JPA.em().persist(this);
return this;
}
如果我使用下面的代码,它工作正常(第一个代码)
entity.nextVersion = entity.actualVersion.clone();
JPA.em().flush();
entity.actualVersion = entity.nextVersion;
entity.nextVersion = null;
JPA.em().flush();
我不太喜欢这个代码,因为我可以像这样使用它(第二个代码)
entity.actualVersion = entity.actualVersion.clone();
JPA.em().flush();
但如果我这样做,外键不会在“实体”表中更新,我不知道为什么。有人能告诉我克隆的两种实现方式有什么区别吗?对我来说,这似乎是JPA的黑魔法,但我找不到答案。
编辑:
这是一段经过重构的代码,以便更容易理解。我没有覆盖Object类中的任何函数,也没有覆盖任何其他函数(例如,我的clone()函数在原始代码中被称为newRound,带有两个参数)
我真的不想做任何模型修改,比如将CascadeType.ALL添加到注释中,或者类似的事情,因为这是一个正在生产的程序,我不知道会产生什么错误。
我只想知道为什么第一个代码更新实体(actual_version_id)中的外键,而第二个没有。我想这一定是那种级联型的。actualVersion变量中的所有批注参数。
在JPA设置中要非常小心克隆();
JPA 环境通常会将跟踪属性添加到类的字节码中,并且可能会混淆。相反,请覆盖默认的 clone()
以创建实际对象,并逐个手动复制所有属性。
无法添加或更新子行:外键约束失败(.,约束外键()引用()) 如果我删除,insert操作将会很好地工作。在将对象插入数据库之前,我检查了这些对象,并确保包含,包含。 用于创建和的SQL脚本为: Hibernate:创建表b(b_id integer not null auto_increment,string_results longtext,a_id integer,主键(b_id)) Hib
问题内容: 我有一对一的关系,但是hibernatetool在生成模式时抱怨。这是显示问题的示例: 人与OtherInfo具有一对一关系: 人是OtherInfo的拥有方。OtherInfo是拥有方,因此person用于在Person中指定属性名称“ otherInfo”。 使用hibernatetool生成数据库架构时出现以下错误: 知道为什么吗?我是在做错什么还是这是Hibernate错误?
我的问题可能看起来很傻。我是JPA的新手,试图理解它的基本概念。我发现有一种@multi-to-one实体关系可以在那里使用。我的问题是,为什么有人想在拥有“一对多”关系的同时使用它?我的意思是,拥有后一个就足够了解关系并发送查询了,对吗?如果没有,请解释。也许我对这两种关系的看法是完全错误的。请提供一个场景作为示例,以便我更好地理解。谢谢
我在数据库中有两个表一对一的关系: 我必须使用来编写Java实体类: 客户端类: 占有实体: 我有一个klientMB,它添加了人和地址 但是当我尝试添加一个Klient时,我出现了这个错误:
问题内容: 也许这是一个愚蠢的问题,但这困扰了我。 我有一个从员工到车辆的双向一对多关系。当我第一次将Employee保留在数据库中时(即它没有分配的ID),我也希望保留其关联的Vehicles。 目前,这对我来说很好,除了我保存的Vehicle实体没有自动映射关联的Employee,并且在数据库中Vehicle表中的employee_id外键列为空。 我的问题是,是否可以在雇员本身被保留的同时保