[jboss-jira] [JBoss JIRA] Created: (EJBTHREE-686) Bidirectional @OneToOne with CascadeType.ALL and optional=false on the non-owning side:

Jeremy Norris (JIRA) jira-events at jboss.com
Thu Aug 10 18:31:14 EDT 2006


Bidirectional @OneToOne with CascadeType.ALL and optional=false on the non-owning side:
---------------------------------------------------------------------------------------

                 Key: EJBTHREE-686
                 URL: http://jira.jboss.com/jira/browse/EJBTHREE-686
             Project: EJB 3.0
          Issue Type: Bug
          Components: EJB3 Extensions
    Affects Versions: EJB 3.0 RC8 - FD, EJB 3.0 RC7 - FD, EJB 3.0 RC6 - PFD
            Reporter: Jeremy Norris


Consider the following two classes:

----- class X:

@Entity
@Table(name="x")
public class X
{
    private Integer id;

    private Y y;
    
    public X()
    {
        this.y = new Y(this);
    }

    @Id
    @GeneratedValue
    @Column(name = "id", nullable=false, updatable=false)
    public Integer getId()
    {
        return id;
    }

    protected void setId(Integer id)
    {
        this.id = id;
    }

    @OneToOne(cascade={CascadeType.ALL}, mappedBy="x")
    public Y getY()
    {
        return y;
    }

    protected void setY(Y y)
    {
        this.y = y;
    }
}

----- class Y:

@Entity
@Table(name="y")
public class Y
{
    private Integer id;
    
    private X x;
    
    protected Y()
    {
    }

    public Y(X x)
    {
        this.x = x;
        x.setY(this);
    }

    @Id
    @GeneratedValue
    @Column(name = "id", nullable=false, updatable=false)
    public Integer getId()
    {
        return id;
    }

    protected void setId(Integer id)
    {
        this.id = id;
    }

    @OneToOne
    @JoinColumn(name="x_id", nullable=false)
    public X getX()
    {
        return x;
    }

    protected void setX(X x)
    {
        this.x = x;
    }
}

----- X is persisted as follows:

// Note: The constructor creates a new dependent Y instance, and hooks it up appropriately:
X x = new X();
        
em.persist(x);

-----

This works fine and persists as expected.  However, if I add "optional=false" to the X. at OneToOne declaration, it fails with the following exception:

javax.ejb.EJBTransactionRolledbackException: javax.persistence.PersistenceException: org.hibernate.PropertyValueException: not-null property references a null or transient value: ... Y.x

Y.x definitely set.  Also, "x == x.getY().getX()" is true.  (Interestingly, this only happens if I put the "optional=false" on the X side.  "optional=false" on the Y side is fine).  This seems like a bug unless there is something I don't understand about "optional", but it seems pretty simply - The spec says the following about this attribute: 

(Optional) Whether the association is optional.
If set to false then a non-null relationship must
always exist.

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://jira.jboss.com/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        



More information about the jboss-jira mailing list