Vra

Ek het 'n tafel wat twee vreemde sleutels aan twee verskillende tafels met beide vreemde sleutels het die deel van een kolom :

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

Soos jy kan sien, is daar twee FKS deel COUNTRY_CODE (toevallig verwysing dieselfde kolom aan die einde van die referentiation pad). Die entiteit klas lyk (JPA 1.0 @IdClass):

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

    ...
}

Soos jy kan sien ek gemerk die eiendom country en COUNTRY_CODE @JoinColumn stad se as lees-alleen (Aparte = vals, updatable = vals). Hibernate versuim met hierdie woorde:

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

Dit lyk redelik basiese om my eerlik. "Meng Aparte en nie Aparte kolomme in 'n eiendom nie toegelaat" is so 'n swak "verskoning", is dit nie?

Indien Hibernate in staat wees om dit te hanteer, bv volgens die JPA spec? Is dit 'n fout?

Was dit nuttig?

Oplossing 2

sal ondersteun met Hibernate 5, sien https://hibernate.atlassian.net/browse / HHH-6221

Ander wenke

Daar is 'n manier om omseil die bekragtiging en kry om dit te werk, dus wat die kolom is 'n "@JoinColumnsOrFormulas" sit dan die oplossing:

Fout:

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

OK

@ManyToOne
@JoinColumns(value = {
    @JoinColumn(name = "country_code", referencedColumnName = "country_code"), 
    @JoinColumn(name = "zip_code", referencedColumnName = "code")})
private Zip zip = null;

@ManyToOne
@JoinColumnsOrFormulas(value = {
    @JoinColumnOrFormula(formula = @JoinFormula(value = "country_code", referencedColumnName = "country_code")),
    @JoinColumnOrFormula(column = @JoinColumn(name = "state_code", referencedColumnName = "state_code")),
    @JoinColumnOrFormula(column = @JoinColumn(name = "city_name", referencedColumnName = "name"))
})
private City city = null;

Groete,

Ek gebruik hiberneer 5 en ek kry nog steeds hierdie uitsondering. As jy insetsel = "false", update = "false" net om een ??by te voeg, sal jy 'n uitsondering wat verklaar dat jy gemengde Aparte en nie-Aparte kolomme kry en dat dit nie toegelaat nie. Dit is 'n kwessie wat reeds in die spoorsnyer, maar lyk nie opgelos moet word. Hibernate gooi AnnotationException op kolom gebruik word deur verskeie oorvleuelende vreemde sleutels

In ons geval, dit beteken dat ons migreer na EclipseLink, wat is in werklikheid redelik maklik gegee dat jy hoofsaaklik moet die persistence.xml vervang en herskryf die HSQL (Hibernate SQL) om JPQL (JPA SQL). Ook jy dalk nodig het om persoonlike benaming strategieë te vervang (Eclipse noem hulle SessionCustomizer). Natuurlik is dit dalk moeiliker wees om te doen as jy spesiale funksies van hiberneer soos gebruik as hiberneer soek ens Maar in ons geval, ons het probeer om op te los oorvleuel vreemde sleutels vir weke wanneer die migrasie net het ure in die einde.

Dit is nog nie opgelos in Hibernate 5. Maar as ek gebruik @JoinColumnsOrFormulas Ek kry ClassCastException. Aanbring insertable = false, updatable = false op alle sluit kolomme opgelos my probleem:

Voorbeeld:

@ManyToOne
@JoinColumns(value = {
    @JoinColumn(name = "country_code", referencedColumnName = "country_code", insertable = false, updatable = false),
    @JoinColumn(name = "state_code", referencedColumnName = "state_code", insertable = false, updatable = false), 
    @JoinColumn(name = "city_name", referencedColumnName = "name", insertable = false, updatable = false)})
private City city = null;
Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top