- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
运行以下代码时,我收到 org.hibernate.exception.ConstraintViolationException
异常
提示
org.h2.jdbc.JdbcSQLException: NULL not allowed for column "SECONDARYELEMENTS_ID";
我知道这是由于从 Container 对象到 Element 对象有两个 @ManyToMany
关系引起的。如果我删除
@ManyToMany(cascade = CascadeType.ALL)
List<Element> secondaryElements;
从 Container 类来看,一切都运行良好。
我在这里缺少什么?
如果您需要更多信息,请告诉我。
@Transactional
public class JPA2Runner {
//hidding Spring Data JPA repository
@Autowired
ContainerDAO containerDAO;
public boolean run() throws Exception{
Container container1 = new Container( );
Container container2 = new Container( );
Element element1 = new Element( container1, container2);
Element element2 = new Element( container2, container1);
container1.getPrimaryElements().add(element1);
container1.getSecondaryElements().add(element2);
container2.getPrimaryElements().add(element2);
container2.getSecondaryElements().add(element1);
containerDAO.saveContainer(container1);
return true;
}
}
@Entity
public class Container extends AbstractEntity {
@ManyToMany(cascade = CascadeType.ALL)
List<Element> primaryElements;
@ManyToMany(cascade = CascadeType.ALL)
List<Element> secondaryElements;
public Container( ){
primaryElements =new ArrayList<Element>();
secondaryElements = new ArrayList<Element>();
}
}
@Entity
public class Element extends AbstractEntity {
@ManyToOne(cascade = CascadeType.ALL)
private Container dedicatedContainer1;
@ManyToOne(cascade = CascadeType.ALL)
private Container dedicatedContainer2;
public Element(){}
public Element(Container container1, Container container2){
this.dedicatedContainer1 = container1;
this.dedicatedContainer2 = container2;
}
}
更新 1:难道同一个类型有多个关系,需要指定@JoinTable吗?
更新 2:感谢@ducksteps 的提示和评论,我能够找到解决该问题的方法。问题是上面的定义生成了一个带有两个元素列表的键的连接表,即
create table Container_Element (Container_id bigint not null, secondaryElements_id bigint not null, primaryElements_id bigint not null)
但是,保存容器会在连接表中生成以下插入内容
insert into Container_Element (Container_id, primaryElements_id) values (?, ?)
这会导致 ConstraintViolation 异常。修复似乎是使用显式定义两个连接表
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name="Container_PrimaryElements")
List<Element> primaryElements;
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name="Container_SecondaryElements")
List<Element> secondaryElements;
这似乎有效。
但是,我仍然想知道是否
最佳答案
我可以想到两个可能的原因:
NOT NULL
或REFERENCES
SECONDARYELEMENTS_ID
的约束CONTAINER_ELEMENT
中的列关系表不可推迟。期间saveContainer()
调用,您可以持久保存与非持久实体的关系。由于这种关系是循环的(Element
涉及 Container
涉及 Element
涉及 [...]),因此无法通过重新排序来解决。我不确定 h2 如何处理这个问题,但我在使用 Postgres 时遇到了这个问题。
ID 生成(在您的情况下)不适用于级联规则。由于某种原因,Element
没有获得生成的 ID - 因此 JPA 将其保留为 ID NULL
(如果您的 ELEMENT
表允许)。
Let me know if you need more information.
来自您:
调试输出,尤其是生成的 SQL 语句(最好带有响应)将有助于找出事务在哪个点失败。您的表定义( CREATE TABLE [...]
,尤其是约束定义)对于查明第一个原因是否可能是这种情况下的问题很有用。
来自其他人:
对 h2 更有经验的人可以告诉你是否需要一些“魔法”(例如在 Postgres 中使 REFERENCES
可延迟)来插入具有循环关系的数据。
Update 1: Could it be that it is required to specify the @JoinTable in case there are multiple relations to the same type?
有可能。规范中有以下示例:
Entity Employee is mapped to a table named EMPLOYEE. Entity Patent is mapped to a table named PATENT. There is a join table that is named EMPLOYEE_PATENT (owner name first). This join table has two foreign key columns. One foreign key column refers to table EMPLOYEE and has the same type as the primary key of EMPLOYEE. This foreign key column is named EMPLOYEE_, where denotes the name of the primary key column of table EMPLOYEE.The other foreign key column refers to table PATENT and has the same type as the primary key of PATENT. This foreign key column is named PATENTS_, where denotes the name of the primary key column of table PATENT.
因此,表名是从实体名称派生的,它的列名是从关系目标列名和字段名派生的。您的连接表有什么结构?如果它有两列以上,那就是你的问题了。
Update 2: [...] better solutions for this issue?
取决于您的用例。您可以使用另一个继承级别,即 PrimaryElement extends Element
和SecondaryElement extends Element
然后使用单个字段 List<Element> elements
存储您的数据(您仍然可以查询特定类型)。当然,这只适用于 Element
的类型。是主要的异或次要的。
Otoh,使用两个联接表甚至可能效果更好,这同样取决于您的用例(额外的联接与更大的表)。
using a join table for both ManyToMany relations "should" actually work (according to the specification)
尝试删除 primaryElements_id
的 NOT NULL 约束和secondaryElements_id
.
关于java - 使用多个ManyToMany关系时的org.hibernate.exception.ConstraintViolationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29526931/
经过大量搜索但没有成功后,我决定在这里提出我的问题,所以我将首先举一个例子来说明问题。 我有 4 个类(class) A - B - C - D我在 A 和 B 之间有一个名为 A_B 的多对多关系(
该应用程序允许用户选择某些关键字(我们监控 TwitterStream) 每个关键字都包含包含其关键字的推文 ID 列表。 public class Keyword extends Model { @
我有 2 个实体:User 和 UsersList。 @Entity @Table(name = "USERS") public class User { @Id @Generated
嘿,我有一个关于人际关系的问题。 我希望用户有友谊。所以一个用户可以成为另一个用户的 friend 。我假设我需要通过 Friendship 表使用 ManyToManyField。但我无法让它工作。
我需要让帖子接受我需要的尽可能多的语言,所以我有两个模型 post和 language在后模型中: public function languages(){ return $this->bel
在我的一个模型中,我有一个属于多条配置的类别字段。 我想知道如何在模板中获得以下输出。 第 1 类、第 2 类、第 3 类和第 4 类 所以基本上用逗号分隔每个类别,除了最后一个用“和”替换 最佳答案
我有一个用于 User 和 House 的多对多表,称为 user_house。我不想只添加两列:user_id 和 house_id,而是添加 3 列:例如,action、created_at、up
我正在做一个食品卡车 API,只是为了学习 spring-boot。在做的过程中,遇到了关于注释 @Manytomany 如何工作的问题。 因为这个项目只是为了学习我想使用Google CLoud F
我有一个ManyToMany链接和一个链接三个对象的外键。 [A]>-----[C] A 可以属于多个 B,反之亦然。但是,A 只能属于具有同一父对象 C 的 B 对象。 我正在尝试在模型的 clea
如果我有两个模型与直通模型具有多对多关系,我如何从该“直通”表中获取数据。 class Bike(models.Model): nickname = models.CharField(max_l
我已经处理我的用户 - 角色 - 映射问题很长一段时间了,但我目前陷入这个问题: 调用 init 方法失败;嵌套异常是 org.hibernate.AnnotationException:使用 @On
我在坚持方面遇到了问题。我有一个膳食类(class),其中有产品列表。在 Product 类中是一个 Meals 列表——@ManyToMany 关系。 当我尝试保存它时,编译器想要保存每个产品,但随
我正在学习 Spring JPA,我从将对象映射到表开始。我对 OneToOne 和 OneToMany 关系没有任何问题,但我不太明白为什么我无法保留与 ManyToMany 关系相关的对象。我有一
我在 MySQL 中创建了表:role tabel 、 object_label 和 role_object_label (链接表) 我定义了@ManyToMany,但出现异常。我的代码有什么问题?
我有一个包含多个延迟初始化集合的类,其中包括 OneToMany 和 ManyToMany。 ManyToMany 关系是单向的,因此 Expert 类没有 Project 集合。 @OneToMan
我阅读了很多关于这个问题的链接: How to save a django model with a manyToMany Through relationship, AND regular many
我已经实现了一个多图像上传方法,但我想知道使用哪些字段/小部件能够将图像 ID 与表单一起传递。 在填写表单时异步添加图像,并且在提交时,这些图像将被分配给表单正在添加/编辑的对象。我怎样才能传递这个
我遇到了一个尚未解决的问题。 环境: MySQL 5 操作系统 hibernate 4.1 Spring 3.1 Spring Data JPA 我有两个处于多对多关系的实体。为此,我使用带有外键的联
我有两个实体 Post 和 Tags 这个实体有 ManyToMany 的关系,很多帖子有很多标签,很多标签有很多帖子,并且有实体类别我有一个类别的很多帖子,我需要创建 Action 来查找类别的帖子
我的类(class)类(class) @Entity public class Course { @Column @Id private String courseCode;
我是一名优秀的程序员,十分优秀!