0

我有一個非常簡單的一個一對多的關係Hibernate的多對一​​外鍵沒有得到設置

[SampleAliasMask] has many [SampleAliasMaskPart] 

我的問題是,當我堅持SampleAliasMask的新實例收集部,我得到一個違反了從SampleAliasMaskPart到SampleAliasMask的表的外鍵鏈接被設置爲NULL的約束違規。

我使用冬眠註釋作爲這樣的映射:

@Entity 
@Table(name="SAMPLE_ALIAS_MASK") 
public class SampleAliasMask extends ClientEntity { 
    @OneToMany(mappedBy = "sampleAliasMask", fetch = FetchType.EAGER, cascade = javax.persistence.CascadeType.ALL, orphanRemoval = true) 
    @Cascade(CascadeType.ALL) 
    @Length(min = 1, message = "The sample alias mask must have components") 
    private Set<SampleAliasMaskPart> components; 

隨着關係的另一半映射爲這樣:

@Entity 
@Table(name="SAMPLE_ALIAS_MASK_PART") 
public class SampleAliasMaskPart extends ClientEntity { 
    @ManyToOne(optional = false, fetch = FetchType.LAZY) 
    @JoinColumn(name = "SAMPLE_ALIAS_MASK_ID", nullable = false) 
    private SampleAliasMask sampleAliasMask; 

ClientEntity的相關部分是

@MappedSuperclass 
public abstract class ClientEntity { 
    @Id 
    @Column(name="ID") 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private long id; 

我正在創建這樣的零件:

HashSet<SampleAliasMaskPart> components = new HashSet<>(); 
for(Map<String, Object> c : this.components) { 
    SampleAliasMaskPart component = new SampleAliasMaskPart(Integer.parseInt(c.get("value").toString(), 10), c.get("name").toString()); 
    result.validate(component); 
    components.add(component); 
} 
mask.setComponents(components); 

確切的錯誤我得到的是:

java.sql.BatchUpdateException: ORA-01400: cannot insert NULL into ("ST"."SAMPLE_ALIAS_MASK_PART"."SAMPLE_ALIAS_MASK_ID") 

我懷疑問題是與事實做,我從來沒有明確設置SampleAliasMaskPart.sampleAliasMask但爲什麼我需要?這種關係永遠不會暴露,也不會導航。該字段僅用於映射目的,這使我認爲我正在映射這個錯誤。

+1

添加爲評論,因爲它不回答你的問題,但你想知道。 '@ Length'驗證字符串長度。您需要'@ Size'來代替。 – 2012-01-08 23:08:11

+0

謝謝,那就是我想要的,是的 – 2012-01-09 00:06:35

回答

1

你的假設是正確的。 Hibernate使用關聯的擁有方知道關聯是否存在。而擁有的一面是沒有mappedBy屬性的一面。

一般規則是,當您有雙向關聯時,您有責任通過初始化/修改關聯的雙方來使對象圖保持一致。 Hibernate並不關心它,但如果你沒有初始化擁有方,它不會持續關聯。

請注意,您不必強制將此關聯設爲雙向。如果你不這樣做,那麼將該部分添加到面具就足夠了,因爲這一面(這是唯一的一面)就是擁有的一面。

+0

等等,你是說我可以從SampleAliasMaskPart中刪除那個私人領域?然後,我如何指定外鍵列的名稱是什麼? – 2012-01-08 20:12:10

+0

在協會的另一邊。見http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#collections-mapping – 2012-01-09 08:56:20

0

JB Nizet建議正確。有兩種方法可以解決這個問題:

  1. 卸下雙向關係:在SampleAliasMaskPart

  2. 取下simpleAliasMask註釋@ManyToOne(optional = false, fetch = FetchType.LAZY)通過執行類似component.setSimpleAliasMask(mask)添加mask每個component。這會做雙向關係。