无法添加或更新子行:外键约束失败(mydb
.a
,约束FK_77PKRKRIN5NQSX16B6NW6K9R7
外键(ID
)引用B
(B_ID
))
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true, value={"hibernateLazyInitializer", "handler"})
@Generated("org.jsonschema2pojo")
@Inheritance(strategy = InheritanceType.JOINED)
@Entity
public class A {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@JsonIgnore
private Integer id;
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY, optional = false)
@PrimaryKeyJoinColumn(referencedColumnName="AId")
@JsonIgnore
private B b;
}
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true, value = {"hibernateLazyInitializer", "handler"})
@Generated("org.jsonschema2pojo")
@Entity
public class B {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int bId;
@OneToOne()
@JsonIgnore
private A a;
}
如果我删除optional=false
,insert操作将会很好地工作。在将对象插入数据库之前,我检查了这些对象,并确保A
包含B
,B
包含A
。
用于创建A
和B
的SQL脚本为:
Hibernate:创建表b(b_id integer not null auto_increment,string_results longtext,a_id integer,主键(b_id))
Hibernate:创建表a(id integer not null auto_increment,主键(id))
Hibernate:alter表b添加约束FK_o3oen721etlltdc7ls82524nh外键(detail_id)引用a(id)
Hibernate:alter表a添加约束FK_77pkrkrin5nqsx16b6nw6k9r7外键(id)引用b(b_id)
当我看到下面这句话:
在将对象插入DB之前,我检查了对象,并确保A包含B,B包含A。
我猜你想要建立一个双向一对一的关系。如果是这样,您当前的映射就不能像预期的那样工作。让我们看看JPA2.0规范(下载链接)对此作了什么说明,以理解这一问题:
•一对多/多对一双向关系的多侧必须是拥有方,因此不能在ManyToOne注释上指定mappedBy元素。
•对于一对一的双向关系,拥有方与包含相应外键的方相对应。
•对于多对多双向关系,任何一方都可能是拥有方。
@Entity
public class A {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY, optional = false)
@JoinColumn(name="b_id", referencedColumnName="ID")
private B b;
}
@Entity
public class B {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
@OneToOne(mappedBy = "b")
private A a;
}
create table a (id integer not null auto_increment,
b_id integer not null,
primary key (id),
foreign key b_id references b (id));
create table b (id integer not null auto_increment,
string_results longtext,
primary key (id));
注:
>
我删除了特定于JSON的注释,以使代码更短(我对它们没有任何了解)
如果要使实体b
成为拥有方,则必须相应地调整关系映射。
我有两个实体。我想在持久化所有者实体时级联插入子实体,并将子实体的SSO_ID设置为生成器为所有者生成的实体。 ID类是: 相反,我得到了一个错误: 插入hub_users_emails(user_sso_idemail_typesso_idstart_dateuser_mail)值 (?, ?, ?, ?, ?) (等) 绑定参数[1]as[BIGINT]-[1234837655]= (等) 将
用户表: 图书目录: 用户模型中的关系: 默认情况下,外键指向主键id。如何使其指向唯一的? 如果只有,是主键,我们可以用第三个参数传递它,并覆盖属性:
问题内容: 我有两个非常简单的对象,并且一个对象应在一组“一对多”关系中包含另一个对象。对象已正确插入数据库中,但“子项”表中的外键始终为“ null”。 我不知道为什么: 这是测试对象,它将子对象保持在其集合中: 这是子对象,它包含指向“ TestObj”的反向链接: 我使用以下代码来持久化此对象: 有人可以解释一下为什么会这样吗? 问题答案: 这很简单:您永远不会初始化中的字段(应将其命名为C
我使用的是PlayFramework 2.3,我有以下类: MyEntity.java: Version.java 当我想为实体创建一个新版本时,我通过分离复制它,将id设置为0,并按如下方式持久化: 如果我使用下面的代码,它工作正常(第一个代码) 我不太喜欢这个代码,因为我可以像这样使用它(第二个代码) 但如果我这样做,外键不会在“实体”表中更新,我不知道为什么。有人能告诉我克隆的两种实现方式有
我在项目中有一对一外键关系映射的问题。 User.java 角色Java语言 这是错误: 导致原因:lass.validateMappingException:无法确定类型:lass.java:265角色,在表:用户,对于列:[inal.jar列(ro)]在org.hibernate.boot.internal.SimpleVmpl.validate类型(SimpleVmpl.java:329)~
无论B表中是否有匹配的记录,左外连接都应该从左表中获取所有数据,但如果左表的right_id列为空,则不能获取记录。 我在解释更多 我发现了这个, HQL支持两种形式的关联连接:隐式和显式。 上一节中显示的查询都使用显式形式,即在from子句中显式使用join关键字。这是推荐的表格。