2014-12-02 83 views
1

我與兩個實體之間的附加列具有多對多關係。在所有者端實體上,我設置了級聯類型以保留。jpa多對多,帶附加列

@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插入到'initial_value''Exception'列中。我不知道爲什麼它是空的,因爲我已經將它設置在服務代碼中。

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

回答

0

我通過將@EmbeddedId更改爲@IdClass並從中間實體類中移除insertable = false,updatable = false來解決問題,現在一切正常。

+0

你可以標記你的答案是正確的 – 2014-12-02 15:36:16

+0

需要2天! – sina 2014-12-02 15:39:40

+0

噢,對不起,我不確定你可以立即接受什麼聲望 – 2014-12-02 15:41:57

0

你確定這個說法

dp.setInitialValue(propertyVals[i]); 

propertyVals[i] is not null 

「可選」財產左右和字段值的會談,並建議 這個功能應該在運行時內進行評估。

+0

是的,我刪除了一些代碼,使其更清晰。肯定它不是空的。 – sina 2014-12-02 12:01:05

+0

@sina你可以打印如果和其他塊語句在控制檯或日誌 – 2014-12-02 12:05:42

+0

當然,這是:http://snag.gy/31Edc.jpg – sina 2014-12-02 12:17:27