[hibernate-issues] [Hibernate-JIRA] Created: (HHH-7267) Eager loading @OneToMany class with @EmbeddedId and @DiscriminatorColumn fails

Jan Čustović (JIRA) noreply at atlassian.com
Sun Apr 22 07:39:48 EDT 2012


Eager loading @OneToMany class with @EmbeddedId and @DiscriminatorColumn fails
------------------------------------------------------------------------------

                 Key: HHH-7267
                 URL: https://hibernate.onjira.com/browse/HHH-7267
             Project: Hibernate ORM
          Issue Type: Bug
          Components: core
    Affects Versions: 4.1.2, 3.6.10
         Environment: Windows 7 x64
            Reporter: Jan Čustović
            Priority: Critical


When I try to load a user which has an owner I get this error. The problem is in @OneToMany userRoles which has @EmbeddedId in combination with @DiscriminatorColumn (if I remove @DiscriminatorColumn it works). Hibernate gets confused because users and users owner userRoles must be loaded.
{code:title=Error|borderStyle=solid}
13:00:08.925 [http-bio-8080-exec-1] ERROR org.hibernate.AssertionFailure - HHH000099: an assertion failure occured (this may indicate a bug in Hibernate, but is more likely due to unsafe use of the session): org.hibernate.AssertionFailure: null identifier
13:00:08.951 [http-bio-8080-exec-1] ERROR com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor - null identifier
org.hibernate.AssertionFailure: null identifier
	at org.hibernate.engine.spi.EntityKey.<init>(EntityKey.java:69) ~[hibernate-core-4.1.2.Final.jar:4.1.2.Final]
	at org.hibernate.internal.AbstractSessionImpl.generateEntityKey(AbstractSessionImpl.java:242) ~[hibernate-core-4.1.2.Final.jar:4.1.2.Final]
	at org.hibernate.loader.Loader.extractKeysFromResultSet(Loader.java:722) ~[hibernate-core-4.1.2.Final.jar:4.1.2.Final]
	at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:635) ~[hibernate-core-4.1.2.Final.jar:4.1.2.Final]
	at org.hibernate.loader.Loader.doQuery(Loader.java:850) ~[hibernate-core-4.1.2.Final.jar:4.1.2.Final]
	at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:289) ~[hibernate-core-4.1.2.Final.jar:4.1.2.Final]
	at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259) ~[hibernate-core-4.1.2.Final.jar:4.1.2.Final]
	...
{code}


{code:title=User.java|borderStyle=solid}
@Entity
@Table(name = "user")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class User extends AbstractBaseEntity {
    
    @Id
    @GeneratedValue
    @Column(name = "id")
    private Integer id;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "owner_id", nullable = true)
    private User          owner;

    @OneToMany(fetch = FetchType.EAGER, mappedBy = "pk.user")
    private Set<UserRole> userRoles;

    ... Other fields, getters & setters, hash, equals
}
{code}

{code:title=UserRole.java|borderStyle=solid}
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "type", discriminatorType = DiscriminatorType.STRING)
@DiscriminatorValue("DEFAULT")
@Table(name = "user_role")
public class UserRole implements Serializable {
    
    @EmbeddedId
    private UserRolePK pk;


    ... Getters & setters, hash, equals
}
{code}

{code:title=UserRolePK.java|borderStyle=solid}
@Embeddable
public class UserRolePK implements Serializable {

    @ManyToOne
    private User user;

    @ManyToOne
    private Role role;

    ... Getters & setters, hash, equals
}
{code}

When I try to change owner to lazy load getOwner() return object with all properties null.
{code}
...
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "owner_id", nullable = true)
    private User          owner;
...
{code}

Changing userRoles to lazy load fixes the problem and everything works good but I need eager load so i added FetchMode.SUBSELECT which also works but I don't want to user hibernate annotations.
{code}
...
    @OneToMany(fetch = FetchType.EAGER, mappedBy = "pk.user")
    @Fetch(value = FetchMode.SUBSELECT)
    private Set<UserRole> userRoles;
...
{code}

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

       



More information about the hibernate-issues mailing list