Hibernate:CascadeType.PERSIST不起作用,但CascadeType.ALL保存对象 [英] Hibernate : CascadeType.PERSIST does not work but CascadeType.ALL to save object

查看:109
本文介绍了Hibernate:CascadeType.PERSIST不起作用,但CascadeType.ALL保存对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



$ javax.persistence.Id
@GeneratedValue(strategy = GenerationType.SEQUENCE,generator =Section_ID_GENERATOR)
@SequenceGenerator(name =Section_ID_GENERATOR,sequenceName =Section_ID_SEQUENCER,initialValue = 1,allocationSize = 1)
@ Column(name =Section_ID)
private int Id;

@Column(name =Section_Name)
私人字符串名称;

@OneToOne(可选= false,cascade = CascadeType.PERSIST)
@JoinColumn(name =Exch_ID)
私人交易所交易所;

// ---构造函数和Getter Setters -----
}


@Entity
@Table(name = EXCHANGE_INST)
public class Exchange {

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE,generator =Exchange_ID_GENERATOR)
@SequenceGenerator(name = Exchange_ID_GENERATOR,sequenceName =Exchange_ID_SEQUENCER,initialValue = 1,allocationSize = 1)
@Column(name =Exchange_ID)
private int Id;

@Column(name =Exchange_name)
私人字符串名称;

@OneToOne(mappedBy =exchange)
private section section;

// ----------- Getter和Setter ...和构造函数

}



以下程序不起作用 - >

  final SessionFactory sessionFactory = configuration.buildSessionFactory(); 
final Session session = sessionFactory.openSession();
session.beginTransaction();

最终兑换兑换=新兑换(MyExchange);
final Section section = new Section(MySection,exchange);
exchange.setSection(section);
session.save(section);

session.getTransaction()。commit();
session.close();

如果我将Section.java中的级联选项更改为CascadeType.ALL,那么它可以工作。

  @OneToOne(可选= false,cascade = CascadeType.PERSIST)---> CascadeType.ALL 
@JoinColumn(name =Exch_ID)
私人交换交换;

我认为PERSIST应该保存我的对象d =,但是会抛出异常:



org.hibernate.TransientPropertyValueException:非空属性引用临时值 - 在当前操作之前必须保存临时实例:Section.exchange - > Exchange

解决方案

对于要级联的 save()操作,您需要启用 CascadeType.SAVE_UPDATE ,使用专有的Hibernate Cascade 注释,因为save()不是标准的JPA操作。或者您需要使用 persist()方法,而不是 save()方法。


@Entity
@Table(name = "Section_INST")
public class Section {

@javax.persistence.Id
@GeneratedValue(strategy = GenerationType.SEQUENCE,generator = "Section_ID_GENERATOR")
@SequenceGenerator(name = "Section_ID_GENERATOR",sequenceName = "Section_ID_SEQUENCER" , initialValue = 1 , allocationSize = 1)
@Column(name = "Section_ID")
private int Id;

@Column(name = "Section_Name")
private String name;

@OneToOne(optional = false,cascade = CascadeType.PERSIST)
@JoinColumn(name = "Exch_ID")
private Exchange exchange;

//---Constructor and Getter Setters-----
}


@Entity
@Table(name = "EXCHANGE_INST")
public class Exchange {

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE,generator = "Exchange_ID_GENERATOR")
@SequenceGenerator(name = "Exchange_ID_GENERATOR",sequenceName = "Exchange_ID_SEQUENCER" , initialValue = 1 , allocationSize = 1)
@Column(name = "Exchange_ID")
private int Id;

@Column(name = "Exchange_name")
private String name;

@OneToOne(mappedBy ="exchange")
private Section section;

//-----------Getter and Setter...And Constructor

}

The following program does not work ->

    final SessionFactory sessionFactory = configuration.buildSessionFactory();
    final Session session = sessionFactory.openSession();
    session.beginTransaction();

    final Exchange exchange = new Exchange("MyExchange");
    final Section section = new Section("MySection" , exchange);
    exchange.setSection(section);
    session.save(section);

    session.getTransaction().commit();
    session.close();

If i change cascade options in Section.java to CascadeType.ALL then it works.

@OneToOne(optional = false,cascade = CascadeType.PERSIST)   --- > CascadeType.ALL 
@JoinColumn(name = "Exch_ID")
private Exchange exchange;

I think PERSIST should save my object d=, but it throws exception :

org.hibernate.TransientPropertyValueException: Not-null property references a transient value - transient instance must be saved before current operation: Section.exchange -> Exchange

解决方案

For the save() operation to be cascaded, you need to enable CascadeType.SAVE_UPDATE, using the proprietary Hibernate Cascade annotation, since save() is not a standard JPA operation. Or you need to use the persist() method, and not the save() method.

这篇关于Hibernate:CascadeType.PERSIST不起作用,但CascadeType.ALL保存对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆