使用JPA Hibernate自动保存子对象

Mar*_*nio 64 java database hibernate

我在Parent和Child表之间有一对多的关系.在父对象中我有一个

List<Child> setChildren(List<Child> childs)
Run Code Online (Sandbox Code Playgroud)

我在Child表中也有一个外键.此外键是引用数据库中的父行的ID.所以在我的数据库配置中,这个外键不能为NULL.此外键也是Parent表中的主键.

所以我的问题是如何通过这样的方式自动保存子对象:

session.save(parent);
Run Code Online (Sandbox Code Playgroud)

我尝试了上面的但我得到一个数据库错误抱怨Child表中的外键字段不能为NULL.有没有办法告诉JPA自动将此外键设置为Child对象,以便它可以自动保存子对象?

提前致谢.

Pas*_*ent 67

我尝试了上面的但我得到一个数据库错误抱怨Child表中的外键字段不能为NULL.有没有办法告诉JPA自动将此外键设置为Child对象,以便它可以自动保存子对象?

嗯,这里有两件事.

首先,您需要级联保存操作(但我的理解是您正在执行此操作,或者在"子"表中插入期间不会出现FK约束违规)

其次,你可能有一个双向关联,我认为你没有正确设置"链接的两面".你应该做这样的事情:

Parent parent = new Parent();
...
Child c1 = new Child();
...
c1.setParent(parent);

List<Child> children = new ArrayList<Child>();
children.add(c1);
parent.setChildren(children);

session.save(parent);
Run Code Online (Sandbox Code Playgroud)

一种常见的模式是使用链接管理方法:

@Entity
public class Parent {
    @Id private Long id;

    @OneToMany(mappedBy="parent")
    private List<Child> children = new ArrayList<Child>();

    ...

    protected void setChildren(List<Child> children) {
        this.children = children;
    }

    public void addToChildren(Child child) {
        child.setParent(this);
        this.children.add(child);
    }
}
Run Code Online (Sandbox Code Playgroud)

代码变成:

Parent parent = new Parent();
...
Child c1 = new Child();
...

parent.addToChild(c1);

session.save(parent);
Run Code Online (Sandbox Code Playgroud)

参考

  • 是的,我的问题是我实际上想要一个单向映射,但有类似双向映射的东西。问题是我在子表中映射了外键。所以我将它从 Child 表中删除并且它起作用了。我在父表中使用了@OneToMany和@JoinColumn。谢谢。 (2认同)

Ade*_*ari 28

我相信你需要通过xml/annotation在映射中设置级联选项.请参阅此处的Hibernate参考示例.

如果你使用注释,你需要做这样的事情,

@OneToMany(cascade = CascadeType.PERSIST) // Other options are CascadeType.ALL, CascadeType.UPDATE etc..
Run Code Online (Sandbox Code Playgroud)

  • 我认为它应该是`@OneToMany(cascade = CascadeType.ALL)`,插入不存在! (7认同)
  • `CascadeType.INSERT`被`CascadeType.PERSIST`取代. (2认同)

shr*_*ram 5

以下程序描述了双向关系在休眠中如何工作。

当父对象保存其子对象列表时,将自动保存。

在家长方面:

    @Entity
    @Table(name="clients")
    public class Clients implements Serializable  {

         @Id
         @GeneratedValue(strategy = GenerationType.IDENTITY)     
         @OneToMany(mappedBy="clients", cascade=CascadeType.ALL)
          List<SmsNumbers> smsNumbers;
    }
Run Code Online (Sandbox Code Playgroud)

并在子端添加以下注释:

  @Entity
  @Table(name="smsnumbers")
  public class SmsNumbers implements Serializable {

     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     int id;
     String number;
     String status;
     Date reg_date;
     @ManyToOne
     @JoinColumn(name = "client_id")
     private Clients clients;

    // and getter setter.

 }
Run Code Online (Sandbox Code Playgroud)

主要类别:

 public static void main(String arr[])
 {
    Session session = HibernateUtil.openSession();
      //getting transaction object from session object
    session.beginTransaction();

    Clients cl=new Clients("Murali", "1010101010");
    SmsNumbers sms1=new SmsNumbers("99999", "Active", cl);
    SmsNumbers sms2=new SmsNumbers("88888", "InActive", cl);
    SmsNumbers sms3=new SmsNumbers("77777", "Active", cl);
    List<SmsNumbers> lstSmsNumbers=new ArrayList<SmsNumbers>();
    lstSmsNumbers.add(sms1);
    lstSmsNumbers.add(sms2);
    lstSmsNumbers.add(sms3);
    cl.setSmsNumbers(lstSmsNumbers);
    session.saveOrUpdate(cl);
    session.getTransaction().commit(); 
    session.close();    

 }
Run Code Online (Sandbox Code Playgroud)

  • 请详细说明您的答案,以便询问者知道您的答案如何以及为何有效。 (2认同)