Нарушение ограничения внешнего ключа при двунаправленной связи «один к одному» с общим первичным ключом - PullRequest
1 голос
/ 26 ноября 2010

Я пытаюсь создать с помощью JPA взаимно-однозначную связь между двумя классами, один из которых является родительским, а другой дочерним, с генератором, чтобы убедиться, что они имеют один и тот же первичный ключ:

@Entity
public class TestFKParent {

    @Column(name="code", nullable=false)    
    @Id 
    private String code;

    @OneToOne(mappedBy="parent", targetEntity=TestFKChild.class, optional=false)    
    @org.hibernate.annotations.Cascade({CascadeType.ALL})
    @PrimaryKeyJoinColumn
    private TestFKChild child;

    // getters and setters
}

и

@Entity
public class TestFKChild {

    @Column(name="id", nullable=false)  
    @Id 
    @GeneratedValue(generator="MyGen")  
    @org.hibernate.annotations.GenericGenerator(name="MyGen",
            strategy="foreign",parameters = @Parameter(name = "property", value = "parent"))    
    private String ID;

    @OneToOne(targetEntity=TestFKParent.class, optional=false)  
    @org.hibernate.annotations.Cascade({})
    @PrimaryKeyJoinColumn
    private TestFKParent parent;

    // getters and setters
}

Я сохраняю объекты с этим кодом:

public void testMerge() throws Exception
{
    TestFKParent parent = new TestFKParent();
    parent.setCode("foo");
    TestFKChild child = new TestFKChild();
    parent.setChild(child);
    child.setParent(parent);

    em.merge(parent);
}

Но, к сожалению, я получаю нарушение внешнего ключа:

com.sybase.jdbc3.jdbc.SybSQLException: Foreign key constraint violation occurred, dbname =  'MYDB', table name = 'TestFKChild', constraint name = 'FKE39B2A659CF5145B'

Глядя на журналы, кажется, что сначала пытается сохранить дочерний объект, но это в этой таблице TestFKChild, у меня есть внешний ключ для родительского TestFKParent.

Как правильно описать такого рода отношения в JPA / Hibernate?

1 Ответ

0 голосов
/ 01 декабря 2010

Вы упомянули, что пытаетесь создать отношения один на один между родителем и ребенком.

Здесь я хотел бы знать why are you keeping Parent class as a memeber variable in Child class?

...