[英]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.