2015-07-28 2 views
4

У меня есть следующая структура таблицы с одним к одному сопоставлением.JPA один к одному сопоставление

public class Parent { 
private long parentPK(Parent primary key); 
private Child child; 

    @OneToOne(
     cascade = {CascadeType.ALL }, 
     fetch = FetchType.LAZY, 
     mappedBy = "child" 
    ) 
    public Child getChild() { 
     return this.child; 
    } 
} 

public class Child{ 

private long childPK(Child primary key); 
private Parent parentFK;(parent foreign key) 

    @OneToOne 
    @JoinColumn(
     name = "PARENT_FK", 
     referencedColumnName = "PARENT_PK" 
    ) 
    public Parent getParentFK() { 
     return this.parentFK; 
    } 
} 

Примечание: родительский стол не имеет ссылки на дочерний стол. Ребенок содержит родительский первичный ключ в качестве столбца внешнего ключа. Здесь первичный ключ для родителя и ребенка отличается.

Согласно моему требованию, при сохранении родительской записи дочерняя запись должна автоматически сохраняться без явного указания внешнего ключа дочерней таблице. Выполнение вышеуказанной структуры в результате «Невозможно вставить ненулевую запись для PARENT_FK в таблице CHILD». Может ли кто-нибудь любезно посоветовать о возможности достижения вышеуказанного требования?

ответ

1

Вы отображение неверен.

Основная проблема, с которой вы сталкиваетесь, - это ваш mappedBy = “child”, относится к атрибуту child на классе Child - не класс Parent. В дочернем классе нет дочернего атрибута, и вам нужно вместо этого ссылаться на атрибут parentPK класса Child.

Я предлагаю оставить PK/FK из имен полей сущности, поскольку это может быть немного запутанным.

Ниже приведены обновленные объекты Parent/Child. (я переключился на доступ поле, но это только мое предпочтение)

@Entity 
public class Child { 
    @Id 
    @Column(name = "childPK") 
    private Long id; 

    @OneToOne 
    @JoinColumn(
     name = "PARENT_FK", 
     referencedColumnName = "PARENT_PK" 
    ) 
     private Parent parent; 

@Entity 
public class Parent { 

    @Id 
    @Column(name = "PARENT_PK") 
    private long id; 

     @OneToOne(
     cascade = {CascadeType.ALL}, 
     fetch = FetchType.LAZY, 
--> mappedBy = "parent") //Refers to parent field of the Child class 

     private Child child; 

Обратите внимание, что вы определили двунаправленные отношения OneToOne. В JPA двунаправленные отношения имеют собственную сторону - сторону с информацией о соединении, Ребенок в вашем случае - и обратная сторона - сторона с атрибутом mappedBy, Родитель в вашем случае. Это хорошая идея, чтобы справиться с этим. Эта ссылка рассматривает отношения OneToOne, и вокруг есть много других. https://en.wikibooks.org/wiki/Java_Persistence/OneToOne

0

Я столкнулся с чем-то подобным. Ваше отображение и все выглядит хорошо. Похоже, вы установили родительский объект Child и не установили Parent для этого дочернего объекта. То есть вы пытаетесь спасти ребенка, не устанавливая его parent.So может быть вам нужно будет сделать так коснуться:

Parent p= new Parent(); 
Child c = new Child(); 
p.setChild(c); 
// c.setParent(p); Looks like this is missing in your code 
session.save(); 
1

Ваше отображение является правильным, и вы не дали сохранения кода для операции сохранения ,

Но вы не можете спасти ребенка, не давая ссылку на родителя, вы не должны установить внешний ключ, но в вашем сохранить метод, который вы должны сделать оба эти:

parent.setChild(child); 
child.setParent(parent); 
Смежные вопросы