13
@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

HakunaMatata
  • 814
  • 2
  • 12
  • 22

1 Answers1

28

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.

JB Nizet
  • 678,734
  • 91
  • 1,224
  • 1,255
  • 8
    I've lost several hours of my life I'll never get back because of this, so thanks! This is not obvious and poorly documented. A bit more info: https://forum.hibernate.org/viewtopic.php?t=951275 – batwad Oct 22 '14 at 09:47
  • 3
    So many hours I have lost... because... of that ORM documentation... =( – Rubens Mariuzzo May 28 '15 at 04:50
  • 1
    If on updating parent object, i donot want child to be updated. Then how can we achieve this if we are using SAVE_UPDATE? – user3681970 Dec 11 '16 at 09:56