我有两个表MAKES
和MODELS
。它们之间的关系@ManyToOne
.
TableMAKES
:
@Column(unique = true)
private String make;
TableMODELS
:
@Column(unique = true)
private String model;
插入模式car
:
makes.setMake("Porsche");
models.setModel("911");
em.persist(makes);
em.persist(models);
添加数据,但如果MAKES
表中存在Porsche
则返回异常:... Duplicate entry 'Porsche' for key ...
.
这个约束违反错误应该是为了防止您意外地做您在这里做的事情-插入两个独立的Make实例,它们的Make列值都为"Porsche"如果需要有多个值为"Porsche"的make,则需要放宽约束以允许重复。
看起来更有可能的是,这是有意的,并且您有一个现有的Make,您希望将其关联到新Model或在新Model下。从数据库中读取现有的make,并在EntityManager上下文中使用该管理实例,而不是尝试持久化一个新的make实例。
Ie
Query q = em.createQuery("select m from Make m where m.make = 'Porsche'");
Make Porsche = q.getSingleResult();
models.setModel("911");
models.setMake(Porsche);
em.persist(models);
你必须在两个Transaction中保存两个表,如果你想在sava之前保存一个Transaction,那么Make table必须在保存它之后检查唯一行。当在一个事务中创建一个异常时,事务反转。