【问题标题】:Hibernate : CascadeType.PERSIST does not work but CascadeType.ALL to save object休眠:CascadeType.PERSIST 不起作用,但 CascadeType.ALL 用于保存对象
【发布时间】:2013-06-29 09:13:49
【问题描述】:
@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

}

以下程序不起作用->

    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();

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

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

我认为 PERSIST 应该保存我的对象 d=,但它会引发异常:

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

【问题讨论】:

    标签: hibernate cascade


    【解决方案1】:

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

    【讨论】:

    • 我已经失去了几个小时的生命,因此我永远不会回来,所以谢谢!这并不明显并且记录不充分。更多信息:forum.hibernate.org/viewtopic.php?t=951275
    • 我失去了这么多小时......因为......那个ORM文档...... =(
    • 如果在更新父对象时,我不想更新子对象。那么如果我们使用 SAVE_UPDATE 怎么实现呢?
    猜你喜欢
    • 1970-01-01
    • 2015-01-30
    • 2015-04-27
    • 2012-08-09
    • 1970-01-01
    • 2017-01-08
    • 2018-01-11
    • 2012-12-06
    相关资源
    最近更新 更多