SORU
24 NİSAN 2009, Cuma


Bire Bir JPA Hazırda ilişkisi

Şema oluşturulurken bir bire bir ilişki ama hibernatetool şikayet var. İşte bu sorunu gösteren bir örnek:

@Entity
public class Person {
    @Id
    public int id;

    @OneToOne
    public OtherInfo otherInfo;

    rest of attributes ...
}

İnsan bire bir Otherİnfo ile ilişkisi: var

@Entity
public class OtherInfo {
    @Id
    @OneToOne(mappedBy="otherInfo")
    public Person person;

    rest of attributes ...
}

Kişi Otherİnfo sahip olan taraf. Otherİnfo ait tarafı 7 ** kişinin kullanması için öznitelik adı "" Kişi. otherİnfo belirtmektir

Hibernatetool veritabanı şeması oluşturmak için kullanırken, aşağıdaki hata iletisini alabilirsiniz:

org.hibernate.MappingException: Could not determine type for: Person, at table: OtherInfo, for columns: [org.hibernate.mapping.Column(person)]
        at org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:292)
        at org.hibernate.mapping.SimpleValue.createIdentifierGenerator(SimpleValue.java:175)
        at org.hibernate.cfg.Configuration.iterateGenerators(Configuration.java:743)
        at org.hibernate.cfg.Configuration.generateDropSchemaScript(Configuration.java:854)
        at org.hibernate.tool.hbm2ddl.SchemaExport.<init>(SchemaExport.java:128)
        ...

Neden herhangi bir fikir? Ben yanlış bir şey yapıyorum ya da bu Hazırda bir hata mı?

CEVAP
25 NİSAN 2009, CUMARTESİ


JPA da izin vermez@İdbir açıklamaOneToOneyaManyToOneeşleme. Yapmaya çalıştığınız şeyi bire bir varlık birliktirpaylaşılan birincil anahtar ile. En basit durumda bire bir paylaşılan anahtar ile tek yönlü:

@Entity
public class Person {
    @Id
    private int id;

    @OneToOne
    @PrimaryKeyJoinColumn
    private OtherInfo otherInfo;

    rest of attributes ...
}

Bu ana sorunu JPA paylaşılan birincil anahtar oluşturma desteği sağlarOtherİnfovarlık. Klasik kitap Java Persistence with Hibernate by Bauer and King sorun için aşağıdaki çözüm Hazırda uzantısını kullanan verir:

@Entity
public class OtherInfo {
    @Id @GeneratedValue(generator = "customForeignGenerator")
    @org.hibernate.annotations.GenericGenerator(
        name = "customForeignGenerator",
        strategy = "foreign",
        parameters = @Parameter(name = "property", value = "person")
    )
    private Long id;

    @OneToOne(mappedBy="otherInfo")
    @PrimaryKeyJoinColumn
    public Person person;

    rest of attributes ...
}

Ayrıca bakınız here.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • jkimisyellow

    jkimisyellow

    6 Mayıs 2009
  • 趣味そうこ♪

    趣味そう

    3 Mart 2010
  • Klemens Torggler

    Klemens Torg

    11 Mart 2008