2016-07-01 6 views
0

ich ein verwirrendes Problem auf Hibernate Assoication Mapping haben, sind hier das Code-Snippet:Wie ein verzögertes Laden schaffen ermöglicht eine Eins-zu-eins-Beziehungen mit gemeinsamen Primärschlüssel Weg

@Entity 
public class Body { 
    @Id 
    public Long getId() { return id; } 

    @OneToOne(cascade = CascadeType.ALL) 
    @PrimaryKeyJoinColumn 
    public Heart getHeart() { 
     return heart; 
    } 
    ... 
}  

@Entity 
public class Heart { 
    @Id 
    public Long getId() { ...} 
}  

Wie ich kennen gelernt habe, wenn ich ein träges Laden das Herz Einheit wollen, während ein Körper laden, muss ich hinzufügen, beide holen = FetchType.LAZY und optional = false zu der Anmerkung, es sieht aus wie:

@OneToOne(cascade = CascadeType.ALL, fetch=FetchType.LAZY, optional=false) 
@PrimaryKeyJoinColumn 
public Heart getHeart() { 
    return heart; 
} 

die optionalen = false bedeutet, dass, wenn Eine neue Körpereinheit wird beibehalten, die zugehörige Entität (hier ist das Herz) muss ebenfalls auf body festgelegt werden, z. B. b ody.setHeart (heart), aber heart muss auch seinen member body setzen: heart.setBody(), body ist jedoch noch nicht persistent, so dass der Wert der Primärschlüsselspalte null ist. Wenn der folgende Code ausgeführt wird, wird die Ausnahme verworfen.

Body body= new Body(); 
Heart heart = new Heart(); 
heart.setBody(body); 
body.setHeart(heart); 
bodyDao.save(body); 

die Ausnahme ist:

Caused by: org.hibernate.id.IdentifierGenerationException: null id generated for:class org.fbb.domain.Heart 
at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:103) 
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:192) 
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:177) 
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:97) 
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:73) 
at org.hibernate.internal.SessionImpl.fireSaveOrUpdate(SessionImpl.java:648) 
at org.hibernate.internal.SessionImpl.saveOrUpdate(SessionImpl.java:640) 
at org.hibernate.engine.spi.CascadingActions$5.cascade(CascadingActions.java:218) 
at org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:398) 
at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:323) 
at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:162) 
at org.hibernate.engine.internal.Cascade.cascade(Cascade.java:111) 

, wie dieses Problem zu lösen? Dank

Antwort

0

Aktualisieren Sie Ihre Herz-Einheit wie unten

@Entity 
Public class Heart{ 
@Id 
@GeneratedValue(generator=foreignmine) 
@GenericGenerator(
     name="foreignmine", 
     strategy="foreign", 
     [email protected](name="property",value="body")) 
public Long getId(){return this.id} 

private Body getBody(){return this.body} 

Dieser Primärschlüssel des Herzens, den Wert des Primärschlüssels des Körpers zu geben, überwintern wird sagen, dass es zu

+0

@ Zulfi in Ihrem Fall verbunden ist, – ylei

+0

@ylei ... hab dich nicht verstanden – Zulfi

Verwandte Themen