title: Should Hibernate be able to handle overlapping foreign keys?
body: <p>I have a table that has two foreign keys to two different tables with both foreign keys <strong>sharing one column</strong>:</p>
  
  <pre><code>CREATE TABLE ZipAreas
  (
    country_code CHAR(2) NOT NULL,
    zip_code VARCHAR(10) NOT NULL,
    state_code VARCHAR(5) NOT NULL,
    city_name VARCHAR(100) NOT NULL,
    PRIMARY KEY (country_code, zip_code, state_code, city_name),
    FOREIGN KEY (country_code, zip_code) REFERENCES Zips (country_code, code),
    FOREIGN KEY (country_code, state_code, city_name) REFERENCES Cities (country_code, state_code, name)
  )
  </code></pre>
  
  <p>As you can see, there are two FKs sharing country_code (coincidentally referencing the same column at the end of the referentiation path). The entity class looks like (JPA 1.0 @IdClass):</p>
  
  <pre><code>@Entity
  @Table(name = "ZipAreas")
  @IdClass(value = ZipAreaId.class)
  public class ZipArea implements Serializable
  {
      @Id
      @Column(name = "country_code", insertable = false, updatable = false)
      private String countryCode;
  
      @Id
      @Column(name = "zip_code", insertable = false, updatable = false)
      private String zipCode;
  
      @Id
      @Column(name = "state_code", insertable = false, updatable = false)
      private String stateCode;
  
      @Id
      @Column(name = "city_name", insertable = false, updatable = false)
      private String cityName;
  
      @ManyToOne
      @JoinColumns(value = {@JoinColumn(name = "country_code", referencedColumnName = "country_code"), @JoinColumn(name = "zip_code", referencedColumnName = "code")})
      private Zip zip = null;
  
      @ManyToOne
      @JoinColumns(value = {@JoinColumn(name = "country_code", referencedColumnName = "country_code", insertable = false, updatable = false), @JoinColumn(name = "state_code", referencedColumnName = "state_code"), @JoinColumn(name = "city_name", referencedColumnName = "name")})
      private City city = null;
  
      ...
  }
  </code></pre>
  
  <p>As you can see I flagged the countryCode property and city's country_code @JoinColumn as read-only (insertable = false, updatable = false). Hibernate fails with this saying:</p>
  
  <pre><code>Exception in thread "main" javax.persistence.PersistenceException: [PersistenceUnit: geoinfo] Unable to configure EntityManagerFactory
      at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:374)
      at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:56)
      at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:48)
      at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:32)
      at tld.geoinfo.Main.main(Main.java:27)
  Caused by: org.hibernate.AnnotationException: Mixing insertable and non insertable columns in a property is not allowed: tld.geoinfo.model.ZipAreacity
      at org.hibernate.cfg.Ejb3Column.checkPropertyConsistency(Ejb3Column.java:563)
      at org.hibernate.cfg.AnnotationBinder.bindManyToOne(AnnotationBinder.java:2703)
      at org.hibernate.cfg.AnnotationBinder.processElementAnnotations(AnnotationBinder.java:1600)
      at org.hibernate.cfg.AnnotationBinder.processIdPropertiesIfNotAlready(AnnotationBinder.java:796)
      at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:707)
      at org.hibernate.cfg.Configuration$MetadataSourceQueue.processAnnotatedClassesQueue(Configuration.java:3977)
      at org.hibernate.cfg.Configuration$MetadataSourceQueue.processMetadata(Configuration.java:3931)
      at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1368)
      at org.hibernate.cfg.Configuration.buildMappings(Configuration.java:1345)
      at org.hibernate.ejb.Ejb3Configuration.buildMappings(Ejb3Configuration.java:1477)
      at org.hibernate.ejb.EventListenerConfigurator.configure(EventListenerConfigurator.java:193)
      at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:1096)
      at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:278)
      at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:362)
      ... 4 more
  </code></pre>
  
  <p>This looks pretty basic to me honestly. "Mixing insertable and non insertable columns in a property is not allowed" is such a weak "excuse", isn't it?</p>
  
  <p>Should Hibernate be able to handle this, e.g. according to the JPA spec? Is this a bug?</p>