-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 2 posts ] 
Author Message
 Post subject: bidirectional one-to-many association with annotations
PostPosted: Thu Jul 22, 2010 2:02 pm 
Beginner
Beginner

Joined: Mon Apr 24, 2006 9:47 pm
Posts: 33
Location: Kansas City, MO
I am using Hibernate/Annotations 3.4.0GA.

I have a User object, which has a List of Address objects. There is a bidirectional association between them. When I save a User, I want hibernate to automatically save the associated Address objects.

I am getting an error when I try to save a User object that contains an Address object. The error is "Cannot insert the value NULL into column 'USER_ID', table 'dbo.ADDRESS'; column does not allow nulls. INSERT fails.". I am hoping someone can show me what I'm doing wrong.

I'm trying to following the documentation for One-to-Many Bidirectional (2.2.5.3.1.1. Bidirectional) where the Troop class is the owning entity. (See http://docs.jboss.org/hibernate/stable/ ... ssociation). I know my code is a little different. I also tried to apply the code from viewtopic.php?p=2372242. Nothing has worked. I could really use some help.

User.java
Code:
@Entity
@Table(name = "USERS")
@Inheritance(strategy = InheritanceType.JOINED)
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class User implements java.io.Serializable
{
    protected static final long serialVersionUID = 5769515016671196464L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "USER_ID")
    protected Integer id;

    @Column(name = "USER_EMAIL", nullable = false, length = 200, unique = true)
    protected String email;

    @Column(name = "USER_FIRST_NAME", length = 100)
    protected String firstName;

    @Column(name = "USER_LAST_NAME", nullable = false, length = 100)
    protected String lastName;

    @Column(name = "USER_PASSWORD", nullable = false, length = 50)
    protected String password;

    @OneToMany(mappedBy="user", cascade=CascadeType.ALL)
    @JoinColumn(name = "USER_ID", referencedColumnName="USER_ID")
    protected Set<Address> addresses = new HashSet<Address>(0);

    public Integer getId() {
        return this.id;
    }

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

    public String getEmail() {
        return this.email;
    }

    public void setEmail(String userEmail) {
        this.email = userEmail;
    }

    public String getFirstName() {
        return this.firstName;
    }

    public void setFirstName(String userFirstName) {
        this.firstName = userFirstName;
    }

    public String getPassword() {
        return this.password;
    }

    public void setPassword(String userPassword) {
        this.password = userPassword;
    }

    public String getLastName() {
        return this.lastName;
    }

    public void setLastName(String userLastName) {
        this.lastName = userLastName;
    }

    public Set<Address> getAddresses() {
        return this.addresses;
    }

    public void setAddresses(Set<Address> addresses) {
        this.addresses = addresses;
    }

    public void addAddress(Address a) {
        addresses.add(a);
        a.setUser(this);
    }

    public void removeAddress(Address a) {
        addresses.remove(a);
        a.setUser(null);
    }

    public boolean equals(Object o)
    {
        if (this == o) return true; // Referential Equality
        if ((o instanceof User) == false) return false; // Type Equality
        return this.hashCode() == o.hashCode();
    }

    public int hashCode() {
        if (id != null) return id.hashCode();
        return super.hashCode();
    }
}


RMM.java
Code:
@Entity
@Table(name = "rmm_users")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class RMM extends User {
    private static final long serialVersionUID = -3809450815523994529L;
}


Address.java
Code:
@Entity
@Table(name = "ADDRESS")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Address implements java.io.Serializable
{
    private static final long serialVersionUID = -5152684995836286617L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ADDRESS_ID")
    private Integer id;

    @Column(name = "ADDRESS_LINE1", nullable = false, length = 100)
    private String addressLine1;

    @Column(name = "ADDRESS_LINE2", length = 100)
    private String addressLine2;

    @Column(name = "ADDRESS_CITY", length = 100)
    private String city;

    @Column(name = "ADDRESS_ZIP5", length = 5)
    private String zip5;

    @Column(name = "ADDRESS_ZIP4", length = 4)
    private String zip4;

    @ManyToOne(cascade=CascadeType.ALL)
    @JoinColumn(name = "USER_ID", referencedColumnName="USER_ID", insertable = false, updatable = false)
    private User user;

    public Integer getId() {
        return this.id;
    }

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

    public String getAddressLine1() {
        return this.addressLine1;
    }

    public void setAddressLine1(String addressLine1) {
        this.addressLine1 = addressLine1;
    }

    public String getAddressLine2() {
        return this.addressLine2;
    }

    public void setAddressLine2(String addressLine2) {
        this.addressLine2 = addressLine2;
    }

    public String getCity() {
        return this.city;
    }

    public void setCity(String addressCity) {
        this.city = addressCity;
    }

    public String getZip5() {
        return this.zip5;
    }

    public void setZip5(String addressZip5) {
        this.zip5 = addressZip5;
    }

    public String getZip4() {
        return this.zip4;
    }

    public void setZip4(String addressZip4) {
        this.zip4 = addressZip4;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }
}


Table Definitions (SQL Server 2005)
Code:
CREATE TABLE [dbo].[USERS](
   [USER_ID] [int] IDENTITY(1,1) NOT NULL,
   [USER_EMAIL] [varchar](200) NOT NULL,
   [USER_PASSWORD] [varchar](50) NOT NULL,
   [USER_FIRST_NAME] [varchar](100) NULL,
   [USER_LAST_NAME] [varchar](100) NULL,
   CONSTRAINT [PK4] PRIMARY KEY NONCLUSTERED
   (
   [USER_ID] ASC
   )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON, FILLFACTOR = 90) ON [PRIMARY]
   ) ON [PRIMARY];

CREATE TABLE [dbo].[RMM_USERS](
   [USER_ID] [int] NOT NULL,
   CONSTRAINT [PK67] PRIMARY KEY CLUSTERED
   (
   [USER_ID] ASC
   )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON, FILLFACTOR = 90) ON [PRIMARY]
   ) ON [PRIMARY];

ALTER TABLE [dbo].[RMM_USERS]  WITH CHECK ADD  CONSTRAINT [RefUSERS128] FOREIGN KEY([USER_ID]) REFERENCES [dbo].[USERS] ([USER_ID]);

CREATE TABLE [dbo].[ADDRESS](
   [ADDRESS_ID] [int] IDENTITY(1,1) NOT NULL,
   [ADDRESS_LINE1] [varchar](100) NOT NULL,
   [ADDRESS_LINE2] [varchar](100) NULL,
   [ADDRESS_CITY] [varchar](100) NOT NULL,
   [ADDRESS_ZIP5] [char](5) NOT NULL,
   [ADDRESS_ZIP4] [char](4) NULL,
   [USER_ID] [int] NOT NULL,
    CONSTRAINT [PK15] PRIMARY KEY NONCLUSTERED
    (
   [ADDRESS_ID] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON, FILLFACTOR = 90) ON [PRIMARY]
    ) ON [PRIMARY];

ALTER TABLE [dbo].[ADDRESS]  WITH CHECK ADD  CONSTRAINT [RefUSERS26] FOREIGN KEY([USER_ID]) REFERENCES [dbo].[USERS] ([USER_ID]);


UserService.java
Code:
User user = new RMM();
  // set user properties...
Address address = new Address();
  // set address properties...
user.addAddress(address);

session.saveOrUpdate(user); // Throws the exception below
// session.persist(user); // this throws the same exception


Error
Code:
2010-07-22 12:27:03,336 DEBUG [org.hibernate.SQL] log -
    insert
    into
        USERS
        (USER_EMAIL, USER_FIRST_NAME, USER_LAST_NAME, USER_PASSWORD)
    values
        (?, ?, ?, ?)
2010-07-22 12:27:03,336 DEBUG [org.hibernate.SQL] log -
    insert
    into
        rmm_users
        (USER_ID)
    values
        (?)
2010-07-22 12:27:03,336 DEBUG [org.hibernate.SQL] log -
    insert
    into
        ADDRESS
        (ADDRESS_LINE1, ADDRESS_LINE2, ADDRESS_CITY, ADDRESS_ZIP4, ADDRESS_ZIP5)
    values
        (?, ?, ?, ?, ?)
2010-07-22 12:27:03,336 ERROR [org.hibernate.util.JDBCExceptionReporter] logExceptions - Cannot insert the value NULL into column 'USER_ID', table 'dbo.ADDRESS'; column does not allow nulls. INSERT fails.
org.hibernate.exception.ConstraintViolationException: could not insert: [platform.domain.Address]
2010-07-22 12:27:03,336 DEBUG [org.springframework.web.servlet.DispatcherServlet] processRequest - Could not complete request
org.hibernate.exception.ConstraintViolationException: could not insert: [platform.domain.Address]
   at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:71)
   at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
   at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:40)
   at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2108)
   at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2588)
   at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:48)
   at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:248)
   at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:290)
   at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:180)
   at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:108)
   at org.hibernate.event.def.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:131)
   at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:87)
   at org.hibernate.impl.SessionImpl.firePersist(SessionImpl.java:609)
   at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:601)
   at org.hibernate.engine.CascadingAction$8.cascade(CascadingAction.java:295)
   at org.hibernate.engine.Cascade.cascadeToOne(Cascade.java:268)
   at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:216)
   at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:169)
   at org.hibernate.engine.Cascade.cascadeCollectionElements(Cascade.java:296)
   at org.hibernate.engine.Cascade.cascadeCollection(Cascade.java:242)
   at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:219)
   at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:169)
   at org.hibernate.engine.Cascade.cascade(Cascade.java:130)
   at org.hibernate.event.def.AbstractSaveEventListener.cascadeAfterSave(AbstractSaveEventListener.java:437)
   at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:326)
   at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:180)
   at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:108)
   at org.hibernate.event.def.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:131)
   at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:87)
   at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:38)
   at org.hibernate.impl.SessionImpl.firePersist(SessionImpl.java:618)
   at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:592)
   at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:596)
   at platform.persistence.hibernate.HibernateDAO.persist(HibernateDAO.java:207)
   at platform.service.defaults.DefaultUserService.createUser(DefaultUserService.java:985)
   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
   at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
   at java.lang.reflect.Method.invoke(Method.java:597)
   at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:307)
   at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
   at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
   at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:108)
   at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
   at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89)
   at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
   at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
   at $Proxy42.createUser(Unknown Source)
   at mvc.controllers.common.AddUserController.doSubmitAction(AddUserController.java:137)
   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
   at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
   at java.lang.reflect.Method.invoke(Method.java:597)
   at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.doInvokeMethod(HandlerMethodInvoker.java:710)
   at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:167)
   at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:414)
   at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:402)
   at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:771)
   at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:716)
   at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:647)
   at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:563)
   at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
   at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
   at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
   at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
   at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:343)
   at org.springframework.security.web.authentication.switchuser.SwitchUserFilter.doFilter(SwitchUserFilter.java:177)
   at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355)
   at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:109)
   at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:83)
   at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355)
   at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:97)
   at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355)
   at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:100)
   at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355)
   at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:78)
   at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355)
   at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54)
   at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355)
   at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:35)
   at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355)
   at org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilter(BasicAuthenticationFilter.java:177)
   at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355)
   at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:188)
   at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355)
   at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:105)
   at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355)
   at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:79)
   at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355)
   at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:149)
   at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237)
   at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167)
   at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
   at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
   at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
   at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174)
   at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
   at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
   at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:544)
   at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
   at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:151)
   at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:200)
   at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:283)
   at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:773)
   at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:703)
   at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:895)
   at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
   at java.lang.Thread.run(Thread.java:619)


Top
 Profile  
 
 Post subject: Re: bidirectional one-to-many association with annotations
PostPosted: Thu Jul 22, 2010 2:06 pm 
Beginner
Beginner

Joined: Mon Apr 24, 2006 9:47 pm
Posts: 33
Location: Kansas City, MO
PS: This was working just fine before I switched from hbm.xml files to Annotations.


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 2 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.