[jboss-user] [EJB 3.0] - @OneToOne, no primary keys...

tsar_bomba do-not-reply at jboss.com
Fri Jul 14 11:35:10 EDT 2006


I'm simply trying to join two entities together w/ a @OneToOne but I'm not using primary keys on either side of the relationship.

Here are my (shortened) entities:


  | @Entity
  | @Table(name="call_req")
  | public class Incident implements Serializable
  | {
  | 	@Column(name="status", insertable=false, updatable=false)
  | 	private String status;
  | 
  | 	@OneToOne(fetch=FetchType.LAZY)
  | 	@JoinColumn(name="status", referencedColumnName="code")
  | 	private IncidentStatus incidentStatus;
  | }
  | 
  | @Entity
  | @Table(name="cr_stat")
  | public class IncidentStatus implements Serializable
  | {
  | 	@Column(name="code", nullable=false, insertable=false, updatable=false)
  | 	private String code;
  | 
  | 	@OneToOne
  | 	private Incident incident;
  | }
  | 

Here's the EJBQL and the query that was generated:


  | Hibernate: 
  |     /* select
  |         i 
  |     from
  |         Incident i 
  |     inner join
  |         fetch i.incidentStatus ist */ select
  |             top 50 incident0_.id as id927_0_,
  |             incidentst1_.id as id928_1_,
  |             incident0_.persid as persid927_0_,
  |             incident0_.ref_num as ref3_927_0_,
  |             incident0_.summary as summary927_0_,
  |             incident0_.description as descript5_927_0_,
  |             incident0_.status as status927_0_,
  |             incident0_.active_flag as active7_927_0_,
  |             incident0_.open_date as open8_927_0_,
  |             incident0_.time_spent_sum as time9_927_0_,
  |             incident0_.last_mod_dt as last10_927_0_,
  |             incident0_.close_date as close11_927_0_,
  |             incident0_.resolve_date as resolve12_927_0_,
  |             incident0_.rootcause as rootcause927_0_,
  |             incident0_.log_agent as log14_927_0_,
  |             incident0_.assignee as assignee927_0_,
  |             incident0_.group_id as group16_927_0_,
  |             incident0_.customer as customer927_0_,
  |             incident0_.charge_back_id as charge18_927_0_,
  |             incident0_.affected_rc as affected19_927_0_,
  |             incident0_.support_lev as support20_927_0_,
  |             incident0_.category as category927_0_,
  |             incident0_.solution as solution927_0_,
  |             incident0_.impact as impact927_0_,
  |             incident0_.priority as priority927_0_,
  |             incident0_.urgency as urgency927_0_,
  |             incident0_.severity as severity927_0_,
  |             incident0_.extern_ref as extern27_927_0_,
  |             incident0_.last_act_id as last28_927_0_,
  |             incident0_.cr_tticket as cr29_927_0_,
  |             incident0_.parent as parent927_0_,
  |             incident0_.template_name as template31_927_0_,
  |             incident0_.sla_violation as sla32_927_0_,
  |             incident0_.predicted_sla_viol as predicted33_927_0_,
  |             incident0_.created_via as created34_927_0_,
  |             incident0_.call_back_date as call35_927_0_,
  |             incident0_.call_back_flag as call36_927_0_,
  |             incident0_.event_token as event37_927_0_,
  |             incident0_.type as type927_0_,
  |             incident0_.change as change927_0_,
  |             incident0_.problem as problem927_0_,
  |             incident0_.incident_priority as incident41_927_0_,
  |             incidentst1_.persid as persid928_1_,
  |             incidentst1_.del as del928_1_,
  |             incidentst1_.sym as sym928_1_,
  |             incidentst1_.last_mod_dt as last5_928_1_,
  |             incidentst1_.description as descript6_928_1_,
  |             incidentst1_.code as code928_1_,
  |             incidentst1_.active as active928_1_,
  |             incidentst1_.hold as hold928_1_,
  |             incidentst1_.resolved as resolved928_1_,
  |             incidentst1_.cr_flag as cr11_928_1_,
  |             incidentst1_.in_flag as in12_928_1_,
  |             incidentst1_.pr_flag as pr13_928_1_,
  |             incidentst1_.incident_id as incident14_928_1_ 
  |         from
  |             call_req incident0_ 
  |         inner join
  |             cr_stat incidentst1_ 
  |                 on incident0_.status=incidentst1_.code
  | 

...it's so *close* - if it wasn't creating that 'incident_id' field out of thin-air (which doesn't actually exist in the table) it would be perfect.  Otherwise, the join is perfect - exactly what I needed.  Of course the exception I get is:

anonymous wrote : 
  | javax.ejb.EJBException
  | 
  | .............
  | 
  | Caused by: javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not execute query
  |         at org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:567)
  |         at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:56)
  | 
  | .............
  | 
  | Caused by: org.hibernate.exception.SQLGrammarException: could not execute query
  |         at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67)
  |         at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
  | 
  | .............
  | 
  | Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Invalid column name 'incident_id'.
  |         at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(Unknown Source)
  | ..............
  | 

I need Incident.status = IncidentStatus.code

I'm getting very close but I can't seem to get the right relationship.  How can I simply join two entities, one-to-one, where I'm not using the primary keys in either of the two tables as part of the relationship?

Thanks very much in advance!

View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=3958116#3958116

Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=3958116



More information about the jboss-user mailing list