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)
Ade*_*ari 28
我相信你需要通过xml/annotation在映射中设置级联选项.请参阅此处的Hibernate参考示例.
如果你使用注释,你需要做这样的事情,
@OneToMany(cascade = CascadeType.PERSIST) // Other options are CascadeType.ALL, CascadeType.UPDATE etc..
Run Code Online (Sandbox Code Playgroud)
以下程序描述了双向关系在休眠中如何工作。
当父对象保存其子对象列表时,将自动保存。
在家长方面:
@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)