[英]Qualified OneToMany-ManyToOne relation
我尝试建立一个示例合格关系,并为联接表中的qualifier列获取空值。
错误:
Internal Exception: java.sql.SQLIntegrityConstraintViolationException:
cannot insert NULL into 'TIRE_POSITION'
实体:
@Entity
public class Bike {
@OneToMany(mappedBy = "bike", cascade=CascadeType.ALL)
@MapKeyColumn(name="TIRE_POSITION", nullable=false)
private Map<String, Tire> tires;
...
}
@Entity
public class Tire {
@ManyToOne(cascade=CascadeType.ALL)
@JoinColumn(name="BIKE_ID")
private Bike bike;
public enum TirePosition{
FRONT("FRONT"), BACK("BACK");
...
}
}
插入调用:
public void testIt(){
Bike bike = new Bike();
Tire tireFront = new Tire();
Tire tireBack = new Tire();
Map<String, Tire> tires = new HashMap<String, Tire>();
tires.put(Tire.TirePosition.BACK.getPosition(), tireBack);
tires.put(Tire.TirePosition.FRONT.getPosition(), tireFront);
bike.setTires(tires);
EntityTransaction trans = em.getTransaction();
trans.begin();
em.persist(bike);
trans.commit();
}
有人知道这里有什么问题吗?
设置关系的双方,还删除nullable = false约束,以查看提供者是否最终设置了该字段。 正如JB Nizet指出的那样,您正在使用JoinColumn关系而不是关系表,这将迫使“ TIRE_POSITION”被放置在Tire表中。 某些提供程序(EclipseLink)将插入Tire表和来自Tire实体的所有数据,然后稍后使用其他实体中包含的映射数据更新引用。 由于“ TIRE_POSITION”字段是通过Bike映射的,因此稍后会更新。 如果是这样,您可以删除数据库约束,也可以将数据库设置为延迟约束处理直到事务处理之后。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.