簡體   English   中英

合格的一對多一對多關系

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM