[hibernate-issues] [Hibernate-JIRA] Resolved: (HHH-5847) @OneToOne annotation with optional = true generates an exception when value is null

Gail Badner (JIRA) noreply at atlassian.com
Mon Aug 22 16:04:04 EDT 2011


     [ http://opensource.atlassian.com/projects/hibernate/browse/HHH-5847?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Gail Badner resolved HHH-5847.
------------------------------

    Resolution: Rejected
      Assignee: Gail Badner

Please use the user forum for help.

> @OneToOne annotation with optional = true generates an exception when value is null
> -----------------------------------------------------------------------------------
>
>                 Key: HHH-5847
>                 URL: http://opensource.atlassian.com/projects/hibernate/browse/HHH-5847
>             Project: Hibernate Core
>          Issue Type: Bug
>          Components: annotations
>    Affects Versions: 3.6.0
>            Reporter: guy bashan
>            Assignee: Gail Badner
>
> I am currently in the process of upgrading from Hibernate 3.3 to 3.6.
> I didn't have the following problem before the upgrade.
> I am getting the following exception when trying to persist an object:
> -------------------------------------------------------------------------------------
> Caused by: org.hibernate.PropertyValueException: not-null property references a null or transient value: com.todacell.ui.model.bo.campaign.Campaign.targetDays
> 	at org.hibernate.engine.Nullability.checkNullability(Nullability.java:100)
> 	at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:312)
> 	at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:203)
> 	at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:129)
> 	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210)
> 	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195)
> 	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:117)
> 	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)
> 	at org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:685)
> 	at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:677)
> 	at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:673)
> 	at com.todacell.ui.model.dao.BaseDAO.saveObject(BaseDAO.java:82)
> 	at com.todacell.ui.model.dao.CampaignDAO.saveObject(CampaignDAO.java:23)
> 	at com.todacell.ui.view.bean.campaign.CampaignGeneralInfoBean.saveAction(CampaignGeneralInfoBean.java:204)
> 	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.apache.el.parser.AstValue.invoke(AstValue.java:172)
> 	at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:276)
> 	at org.apache.jasper.el.JspMethodExpression.invoke(JspMethodExpression.java:68)
> 	... 37 more
> ---------------------------------------------------------------------------------------------------------------------------------------------------------------------
> Seems like there is a problem when I am trying to persist the object with: targetDays empty (it should be empty at this point).
> This is the bean I am using:
> -----------------------------------
> @Entity
> @Table(name = "cmp_campaign")
> public class Campaign implements Serializable {
>     @Id
>     @GeneratedValue(strategy = GenerationType.AUTO)
>     @Column(name = "campaign_id")
>     private Integer campaignId;
>     @Column(name = "name")
>     @NotNull
>     @Length(max = 100)
>     private String name;
>     @Column(name = "creative_name")
>     @Length(max = 100)
>     private String creativeName;
>     @Column(name = "comments")
>     @Length(max = 4000)
>     private String comments;
>     @ManyToOne
>     @JoinColumn(name = "advertiser_id")
>     private Advertiser advertiser;
>     @ManyToOne
>     @JoinColumn(name = "agency_id")
>     private Agency agency;
>     @OneToMany(mappedBy = "campaign", cascade = {javax.persistence.CascadeType.ALL})
>     @OrderBy("adId")
>     @Cascade({org.hibernate.annotations.CascadeType.ALL, org.hibernate.annotations.CascadeType.DELETE_ORPHAN})
>     private Set<Ad> ads;
>     @OneToOne(mappedBy = "campaign")
>     @JoinColumn(name = "campaign_id")
>     @Cascade({org.hibernate.annotations.CascadeType.ALL, org.hibernate.annotations.CascadeType.DELETE_ORPHAN})
>     private DeliveryLimits deliveryLimits;
>     @OneToOne(mappedBy = "campaign")
>     @JoinColumn(name = "campaign_id")
>     @Cascade({org.hibernate.annotations.CascadeType.ALL, org.hibernate.annotations.CascadeType.DELETE_ORPHAN})
>     private Cost cost;
>     @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
>     @JoinTable(name = "cmp_target_list_option",
>             joinColumns = {@JoinColumn(name = "campaign_id")},
>             inverseJoinColumns = @JoinColumn(name = "option_id"))
>     private Set<ListTargetingParamOption> listTargetingParamOptions;
>     @OneToOne(optional = true)
>     @Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE})
>     @PrimaryKeyJoinColumn
>     private LastStatus lastStatus;
>     @OneToMany(mappedBy = "campaign")
>     @Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE, org.hibernate.annotations.CascadeType.DELETE_ORPHAN})
>     @Sort(type = SortType.COMPARATOR, comparator = TargetKeyword.TargetKeywordComparator.class)
>     private SortedSet<TargetKeyword> targetKeywords;
>     @OneToMany(mappedBy = "campaign")
>     @Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE, org.hibernate.annotations.CascadeType.DELETE_ORPHAN})
>     private Set<TargetNumberRange> targetNumberRanges;
>     @OneToOne(fetch = FetchType.LAZY, optional = true)
>     @Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE})
>     @PrimaryKeyJoinColumn
>     private TargetDays targetDays;
>     @OneToMany(mappedBy = "campaign")
>     @Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE, org.hibernate.annotations.CascadeType.DELETE_ORPHAN})
>     @Sort(type = SortType.COMPARATOR, comparator = TargetDayPart.TargetDayPartComparator.class)
>     private SortedSet<TargetDayPart> targetDayParts;
>     @OneToMany(mappedBy = "targetTesterPK.campaign")
>     @Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE, org.hibernate.annotations.CascadeType.DELETE_ORPHAN})
>     @Sort(type = SortType.COMPARATOR, comparator = TargetTester.TargetTesterComparator.class)
>     private SortedSet<TargetTester> targetTesters;
>     @OneToMany(mappedBy = "targetLocationPK.campaign")
>     @Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE, org.hibernate.annotations.CascadeType.DELETE_ORPHAN})
>     private Set<TargetLocation> targetLocations;
>     @OneToMany(mappedBy = "targetCountryMobileOperatorPK.campaign")
>     @Cascade({org.hibernate.annotations.CascadeType.ALL, org.hibernate.annotations.CascadeType.DELETE_ORPHAN})
>     private Set<TargetOperator> targetOperators;
>     @OneToMany(mappedBy = "campaign")
>     @Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE, org.hibernate.annotations.CascadeType.DELETE_ORPHAN})
>     private Set<TargetSystem> targetSystems;
>     @OneToMany(mappedBy = "targetDevicePK.campaign")
>     @Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE, org.hibernate.annotations.CascadeType.DELETE_ORPHAN})
>     private Set<TargetDevice> targetDevices;
>     @OneToMany(mappedBy = "targetDeviceOsPK.campaign")
>     @Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE, org.hibernate.annotations.CascadeType.DELETE_ORPHAN})
>     private Set<TargetDeviceOs> targetDeviceOss;
>     @OneToMany(mappedBy = "targetIpPK.campaign")
>     @Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE, org.hibernate.annotations.CascadeType.DELETE_ORPHAN})
>     private Set<TargetIp> targetIps;
>     @OneToMany(mappedBy = "targetIpRangePK.campaign")
>     @Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE, org.hibernate.annotations.CascadeType.DELETE_ORPHAN})
>     private Set<TargetIpRange> targetIpRanges;
>     @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
>     @JoinTable(name = "cmp_target_publisher",
>             joinColumns = {@JoinColumn(name = "campaign_id")},
>             inverseJoinColumns = @JoinColumn(name = "publisher_id"))
>     @Sort(type = SortType.COMPARATOR, comparator = Publisher.PublisherComparator.class)
>     private SortedSet<Publisher> targetPublishers;
>     @Column(name = "source")
>     @Type(type = "com.todacell.ui.model.persistence.StringValuedEnumType",
>             parameters = @Parameter(name = "enum", value = "com.todacell.ui.model.bo.system.CampaignSource"))
>     @NotNull
>     private CampaignSource source;
>     @ManyToOne
>     @JoinColumn(name = "third_party_id")
>     private ThirdPartyServer thirdPartyServer;
>     @ManyToOne
>     @JoinColumn(name = "order_id")
>     private Order order;
>     @Column(name = "time_zone")
>     @NotNull
>     @Length(max = 50)
>     private String timeZone;
>     @Column(name = "status_check_date")
>     private Date statusCheckDate;
>     @Column(name = "active")
>     private Boolean active;
>     @Column(name = "version_current_date")
>     private Date versionCurrentDate;
>     @Column(name = "version_deploy_date")
>     private Date versionDeployDate;
>     @Column(name = "category")
>     @Type(type = "com.todacell.ui.model.persistence.StringValuedEnumType",
>             parameters = @Parameter(name = "enum", value = "com.todacell.ui.model.bo.system.CampaignCategory"))
>     @NotNull
>     private CampaignCategory category;
>     @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
>     @JoinTable(name = "cmp_target_site",
>             joinColumns = {@JoinColumn(name = "campaign_id")},
>             inverseJoinColumns = @JoinColumn(name = "site_id"))
>     @Sort(type = SortType.COMPARATOR, comparator = Site.SiteComparator.class)
>     private SortedSet<Site> targetSites;
>     public Campaign() {
>     }
>     public Integer getCampaignId() {
>         return campaignId;
>     }
>     public void setCampaignId(Integer campaignId) {
>         this.campaignId = campaignId;
>     }
>     public String getName() {
>         return name;
>     }
>     public void setName(String name) {
>         this.name = name;
>     }
>     public String getCreativeName() {
>         return creativeName;
>     }
>     public void setCreativeName(String creativeName) {
>         this.creativeName = creativeName;
>     }
>     public String getComments() {
>         return comments;
>     }
>     public void setComments(String comments) {
>         this.comments = comments;
>     }
>     public Advertiser getAdvertiser() {
>         return advertiser;
>     }
>     public void setAdvertiser(Advertiser pubAdvertiser) {
>         this.advertiser = pubAdvertiser;
>     }
>     public Agency getAgency() {
>         return agency;
>     }
>     public void setAgency(Agency agency) {
>         this.agency = agency;
>     }
>     public Set<Ad> getAds() {
>         return ads;
>     }
>     public void setAds(Set<Ad> ads) {
>         this.ads = ads;
>     }
>     public DeliveryLimits getDeliveryLimits() {
>         return deliveryLimits;
>     }
>     public void setDeliveryLimits(DeliveryLimits deliveryLimits) {
>         this.deliveryLimits = deliveryLimits;
>     }
>     public Cost getCost() {
>         return cost;
>     }
>     public void setCost(Cost cost) {
>         this.cost = cost;
>     }
>     public Double getPublisherCost()
>     {
>       return CampaignPerformanceUtil.getPublisherCost(cost);
>     }
>     public LastStatus getLastStatus() {
>         return lastStatus;
>     }
>     public void setLastStatus(LastStatus lastStatus) {
>         this.lastStatus = lastStatus;
>     }
>     public Set<TargetKeyword> getTargetKeywords() {
>         return targetKeywords;
>     }
>     public void setTargetKeywords(SortedSet<TargetKeyword> targetKeywords) {
>         this.targetKeywords = targetKeywords;
>     }
>     public Set<TargetNumberRange> getTargetNumberRanges() {
>         return targetNumberRanges;
>     }
>     public void setTargetNumberRanges(Set<TargetNumberRange> targetNumberRanges) {
>         this.targetNumberRanges = targetNumberRanges;
>     }
>     public TargetDays getTargetDays() {
>         return targetDays;
>     }
>     public void setTargetDays(TargetDays targetDays) {
>         this.targetDays = targetDays;
>     }
>     public Set<TargetDayPart> getCmpTargetDayParts() {
>         return targetDayParts;
>     }
>     public void setCmpTargetDayParts(SortedSet<TargetDayPart> targetDayParts) {
>         this.targetDayParts = targetDayParts;
>     }
>     public Set<TargetTester> getTargetTesters() {
>         return targetTesters;
>     }
>     public void setTargetTesters(SortedSet<TargetTester> targetTesters) {
>         this.targetTesters = targetTesters;
>     }
>     public Set<TargetLocation> getTargetLocations() {
>       return targetLocations;
>     }
>     public void setTargetLocations(Set<TargetLocation> targetLocations) {
>       this.targetLocations = targetLocations;
>     }
>   public Set<TargetDevice> getTargetMobileDevices() {
>         return targetDevices;
>     }
>     public void setTargetMobileDevices(Set<TargetDevice> targetDevices) {
>         this.targetDevices = targetDevices;
>     }
>     public Set<TargetOperator> getTargetCountryMobileOperators() {
>         return targetOperators;
>     }
>     public Set<TargetDeviceOs> getTargetDeviceOss() {
>         return targetDeviceOss;
>     }
>     public void setTargetDeviceOss(Set<TargetDeviceOs> targetDeviceOss) {
>         this.targetDeviceOss = targetDeviceOss;
>     }
>     public Set<TargetIp> getTargetIps() {
>         return targetIps;
>     }
>     public void setTargetIps(Set<TargetIp> targetIps) {
>         this.targetIps = targetIps;
>     }
>     public void setTargetCountryMobileOperators(Set<TargetOperator> targetOperators) {
>         this.targetOperators = targetOperators;
>     }
>     public Set<TargetSystem> getTargetSystems() {
>         return targetSystems;
>     }
>     public void setTargetSystems(Set<TargetSystem> targetSystems) {
>         this.targetSystems = targetSystems;
>     }
>     public SortedSet<Publisher> getTargetPublishers() {
>         return targetPublishers;
>     }
>     public void setTargetPublishers(SortedSet<Publisher> targetPublishers) {
>         this.targetPublishers = targetPublishers;
>     }
>     public CampaignSource getSource() {
>         return source;
>     }
>     public void setSource(CampaignSource source) {
>         this.source = source;
>     }
>     public ThirdPartyServer getThirdPartyServer() {
>         return thirdPartyServer;
>     }
>     public void setThirdPartyServer(ThirdPartyServer thirdPartyServer) {
>         this.thirdPartyServer = thirdPartyServer;
>     }
>     public String getTimeZone() {
>         return timeZone;
>     }
>     public void setTimeZone(String timeZone) {
>         this.timeZone = timeZone;
>     }
>     public TimeZone getTimeZoneObj() {
>         return TimeZone.getTimeZone(timeZone);
>     }
>     public Date getStatusCheckDate() {
>         return statusCheckDate;
>     }
>     public void setStatusCheckDate(Date statusCheckDate) {
>         this.statusCheckDate = statusCheckDate;
>     }
>     public Boolean isActive() {
>         return active;
>     }
>     public void setActive(Boolean active) {
>         this.active = active;
>     }
>     public CampaignCategory getCategory() {
>         return category;
>     }
>     public void setCategory(CampaignCategory category) {
>         this.category = category;
>     }
>     public Date getVersionCurrentDate() {
>         return versionCurrentDate;
>     }
>     public void setVersionCurrentDate(Date versionCurrentDate) {
>         this.versionCurrentDate = versionCurrentDate;
>     }
>     public Date getVersionDeployDate() {
>         return versionDeployDate;
>     }
>     public void setVersionDeployDate(Date versionDeployDate) {
>         this.versionDeployDate = versionDeployDate;
>     }
>     public Set<ListTargetingParamOption> getListTargetingParamOptions() {
>         return listTargetingParamOptions;
>     }
>     public void setListTargetingParamOptions(Set<ListTargetingParamOption> listTargetingParamOptions) {
>         this.listTargetingParamOptions = listTargetingParamOptions;
>     }
>   public Order getOrder() {
>     return order;
>   }
>   public void setOrder(Order order) {
>     this.order = order;
>   }
>   public List<Advertiser> getActiveAdvertisers(){
>         SysDAO dao = DAOFactory.getSysDAO();
>         return dao.getActiveAdvertisers();       
>     }
>   public static class CampaignComparator implements Comparator<Campaign>, Serializable
>   {
>     public int compare(Campaign campaign1, Campaign campaign2)
>     {
>       return campaign1.getName().compareTo(campaign2.getName());
>     }
>   }
>   public SortedSet<Site> getTargetSites() {
>     return targetSites;
>   }
>   public void setTargetSites(SortedSet<Site> targetSites) {
>     this.targetSites = targetSites;
>   }
>   public Set<TargetIpRange> getTargetIpRanges() {
>     return targetIpRanges;
>   }
>   public void setTargetIpRanges(Set<TargetIpRange> targetIpRanges) {
>     this.targetIpRanges = targetIpRanges;
>   }
> }

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