繁体   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