带有附加列的jpa多对多

时间:2014-12-02 11:48:30

标签: java many-to-many eclipselink

我与两个实体之间的附加列有多对多的关系。在所有者方实体上,我已将级联类型设置为保持不变。

    @OneToMany(cascade=CascadeType.PERSIST, fetch = FetchType.LAZY, mappedBy = "definitionType")
    private List<DefinitionProperty> definitionProperties = new ArrayList<DefinitionProperty>();

这是我的新实体,代表表格:

@EmbeddedId
protected DefinitionPropertyPK pk;

@JoinColumn(name = "dtid", referencedColumnName = "id", insertable = false, updatable = false)
@ManyToOne(optional = false)
private DefinitionType definitionType;
@JoinColumn(name = "prid", referencedColumnName = "id", insertable = false, updatable = false)
@ManyToOne(optional = false)
private Property property;
@Column(name = "initial_value", insertable = false, updatable = false)
@Basic(optional = false)
private String initialValue;

问题是,当我持久化所有者对象时,它将被插入到数据库中,但是在连接表中不会创建任何内容,并且我得到“无法将值NULL插入列&#39; initial_value&#39;&# 39;例外。我不知道为什么它是null因为我已经在服务代码中设置了它。

Call: INSERT INTO definition_property (initial_value, dtid, prid) VALUES (?, ?, ?)
    bind => [3 parameters bound]

这是我的服务代码以及如何创建新对象并设置其值。

DefinitionType definitionType = new DefinitionType();
        String propertyIds[] = idProperty.split(",");
        String propertyVals[] = propertyValues.split(",");
        for (int i = 0; i < propertyIds.length; i++) {
            Property property = propertyDao.find(Integer.parseInt(propertyIds[i]));
            DefinitionProperty dp = new DefinitionProperty();

            if (propertyVals[i] != "" || propertyVals[i]!=null) {
            dp.setInitialValue(propertyVals[i]);
            } else {
            dp.setInitialValue(property.getInitialValue());
        }
            dp.setDefinitionType(definitionType);
            dp.setProperty(property);
            definitionType.getDefinitionProperties().add(dp);
         }          
        definitionTypeDao.persist(definitionType);

您可以找到所有代码here

2 个答案:

答案 0 :(得分:0)

你确定这句话

dp.setInitialValue(propertyVals[i]);

propertyVals[i] is not null
  

&#39;可选&#39;谈论财产和田地价值,并建议   应在运行时评估此功能。

答案 1 :(得分:0)

我通过将@EmbeddedId更改为@IdClass并从我的中间实体类中删除insertable = false,updatable = false来解决,现在一切正常。