[
https://issues.apache.org/jira/browse/OPENJPA-2874?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Will Dazey updated OPENJPA-2874:
--------------------------------
Description:
Very similar to https://github.com/hibernate/hibernate-orm/pull/3817. Tested on
2.2.2 and I could not find an existing bug that fixed this already.
Entities:
{code:java}
@Entity
public class RaceDriver {
@Id private Integer id;
@Embedded private Car car;
private String name;
}
@Embeddable
public class Car {
@OneToOne(orphanRemoval = true, fetch = FetchType.LAZY)
private Engine engine;
@Column private String color;
}
@Entity
public class Engine {
@Id private Integer id;
private Integer horsePower;
}
{code}
Test:
{code:java}
em.getTransaction().begin();
final Engine engine = new Engine( 1, 275 );
final Car car = new Car(1, engine, "red");
final RaceDriver raceDriver = new RaceDriver(1, "Bob", car);
em.persist( engine );
em.persist( raceDriver );
em.getTransaction().commit();
em.clear();
em.getTransaction().begin();
final RaceDriver raceDriverFind = em.find( RaceDriver.class, 1);
final Car carFind = raceDriverFind.getCar();
//check, that at the moment the engine exists
Assert.assertNotNull(carFind.getEngine());
//update parent entity
raceDriverFind.setName("Ted");
//update the embeddable
car.setColor("green");
//orphan the engine object
car.setEngine( null );
em.getTransaction().commit();
{code}
Trace:
{code:sql}
UPDATE RaceDriver SET name = ? WHERE id = ?
[params=(String) Ted, (int) 1]
{code}
The issue is that OpenJPA is not updating the embeddable values on transaction
commit. Also, OpenJPA is not removing the orphaned Engine reference.
was:
Very similar to https://github.com/hibernate/hibernate-orm/pull/3817. Tested on
2.2.2 and I could not find an existing bug that fixed this already.
Entities:
{code:java}
@Entity
public class RaceDriver {
@Id private Integer id;
@Embedded private Car car;
private String name;
}
@Embeddable
public class Car {
@Id private Integer id;
@OneToOne(orphanRemoval = true, fetch = FetchType.LAZY)
private Engine engine;
@Column private String color;
}
@Entity
public class Engine {
@Id private Integer id;
private Integer horsePower;
}
{code}
Test:
{code:java}
em.getTransaction().begin();
final Engine engine = new Engine( 1, 275 );
final Car car = new Car(1, engine, "red");
final RaceDriver raceDriver = new RaceDriver(1, "Bob", car);
em.persist( engine );
em.persist( raceDriver );
em.getTransaction().commit();
em.clear();
em.getTransaction().begin();
final RaceDriver raceDriverFind = em.find( RaceDriver.class, 1);
final Car carFind = raceDriverFind.getCar();
//check, that at the moment the engine exists
Assert.assertNotNull(carFind.getEngine());
//update parent entity
raceDriverFind.setName("Ted");
//update the embeddable
car.setColor("green");
//orphan the engine object
car.setEngine( null );
em.getTransaction().commit();
{code}
Trace:
{code:sql}
UPDATE RaceDriver SET name = ? WHERE id = ?
[params=(String) Ted, (int) 1]
{code}
The issue is that OpenJPA is not updating the embeddable values on transaction
commit. Also, OpenJPA is not removing the orphaned Engine reference.
> Embeddable objects are not updated and orphaned references removed
> ------------------------------------------------------------------
>
> Key: OPENJPA-2874
> URL: https://issues.apache.org/jira/browse/OPENJPA-2874
> Project: OpenJPA
> Issue Type: Bug
> Components: jpa
> Affects Versions: 2.2.2
> Reporter: Will Dazey
> Priority: Minor
>
> Very similar to https://github.com/hibernate/hibernate-orm/pull/3817. Tested
> on 2.2.2 and I could not find an existing bug that fixed this already.
> Entities:
> {code:java}
> @Entity
> public class RaceDriver {
> @Id private Integer id;
> @Embedded private Car car;
> private String name;
> }
> @Embeddable
> public class Car {
> @OneToOne(orphanRemoval = true, fetch = FetchType.LAZY)
> private Engine engine;
> @Column private String color;
> }
> @Entity
> public class Engine {
> @Id private Integer id;
> private Integer horsePower;
> }
> {code}
> Test:
> {code:java}
> em.getTransaction().begin();
> final Engine engine = new Engine( 1, 275 );
> final Car car = new Car(1, engine, "red");
> final RaceDriver raceDriver = new RaceDriver(1, "Bob", car);
> em.persist( engine );
> em.persist( raceDriver );
> em.getTransaction().commit();
> em.clear();
> em.getTransaction().begin();
> final RaceDriver raceDriverFind = em.find( RaceDriver.class, 1);
> final Car carFind = raceDriverFind.getCar();
> //check, that at the moment the engine exists
> Assert.assertNotNull(carFind.getEngine());
> //update parent entity
> raceDriverFind.setName("Ted");
> //update the embeddable
> car.setColor("green");
> //orphan the engine object
> car.setEngine( null );
> em.getTransaction().commit();
> {code}
> Trace:
> {code:sql}
> UPDATE RaceDriver SET name = ? WHERE id = ?
> [params=(String) Ted, (int) 1]
> {code}
> The issue is that OpenJPA is not updating the embeddable values on
> transaction commit. Also, OpenJPA is not removing the orphaned Engine
> reference.
--
This message was sent by Atlassian Jira
(v8.3.4#803005)