2013-04-29 33 views
7

Tôi không thể thực hiện quan hệ nhiều-nhiều bằng bảng tham gia (https://stackoverflow.com/a/7603036 & https://en.wikibooks.org/wiki/Java_Persistence/ManyToMany#Mapping_a_Join_Table_with_Additional_Columns). Khi tôi cố gắng tái tạo nó, nó không thể xây dựng EntityManagerFactory. Dường như Envers không đọc được ánh xạ theo thuộc tính, mặc dù nó có vẻ tốt với tôi. Tôi đang làm gì sai? Cách đúng ™ để thực hiện quan hệ nhiều-nhiều với các cột phụ (và Envers) là gì?Hibernate/Envers không thể đọc được ánh xạ theo thuộc tính

Product.java

@Entity 
@Audited 
public class Product extends UserModel { 
... 
    @OneToMany(mappedBy = "product", orphanRemoval = true, cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
    public List<ProductForm> forms = new ArrayList<ProductForm>(); 
... 
} 

Form.java

@Entity 
@Audited 
public class Form extends UserModel { 
... 
    @OneToMany(mappedBy = "form", fetch = FetchType.LAZY) 
    public List<ProductForm> products = new ArrayList<ProductForm>(); 
... 
} 

ProductForm.java

@Entity 
@Table(name = "Product_Form") 
@IdClass(ProductForm.ProductFormId.class) 
public class ProductForm { 
    @Id 
    @JoinColumn(name = "product_id") 
    @ManyToOne 
    public Product product; 

    @Id 
    @JoinColumn(name = "form_id") 
    @ManyToOne 
    public Form form; 

    public ProductForm(Product product, Form form) { 
     this.product = product; 
     this.form = form; 
    } 

    @Embeddable 
    @SuppressWarnings("serial") 
    public class ProductFormId implements Serializable { 
     @Column(name = "product_id") 
     public Long product; 

     @Column(name = "form_id") 
     public Long form; 
    } 
} 

Stack trace

play.api.UnexpectedException: Unexpected exception[PersistenceException: [PersistenceUnit: defaultPersistenceUnit] Unable to build EntityManagerFactory] 
    at play.core.ReloadableApplication$$anonfun$get$1$$anonfun$1.apply(ApplicationProvider.scala:142) ~[play_2.10-2.1.1.jar:2.1.1] 
    at play.core.ReloadableApplication$$anonfun$get$1$$anonfun$1.apply(ApplicationProvider.scala:106) ~[play_2.10-2.1.1.jar:2.1.1] 
    at scala.Option.map(Option.scala:145) ~[scala-library.jar:na] 
    at play.core.ReloadableApplication$$anonfun$get$1.apply(ApplicationProvider.scala:106) ~[play_2.10-2.1.1.jar:2.1.1] 
    at play.core.ReloadableApplication$$anonfun$get$1.apply(ApplicationProvider.scala:104) ~[play_2.10-2.1.1.jar:2.1.1] 
    at scala.util.Either$RightProjection.flatMap(Either.scala:523) [scala-library.jar:na] 
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: defaultPersistenceUnit] Unable to build EntityManagerFactory 
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:930) ~[hibernate-entitymanager-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:904) ~[hibernate-entitymanager-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:72) ~[hibernate-entitymanager-4.2.0.Final.jar:4.2.0.Final] 
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:63) ~[hibernate-jpa-2.0-api-1.0.1.Final.jar:1.0.1.Final] 
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:47) ~[hibernate-jpa-2.0-api-1.0.1.Final.jar:1.0.1.Final] 
    at play.db.jpa.JPAPlugin.onStart(JPAPlugin.java:35) ~[play-java-jpa_2.10-2.1.1.jar:2.1.1] 
Caused by: org.hibernate.MappingException: Unable to read the mapped by attribute for products in models.ProductForm! 
    at org.hibernate.envers.configuration.metadata.CollectionMetadataGenerator.getMappedBy(CollectionMetadataGenerator.java:642) ~[hibernate-envers-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.envers.configuration.metadata.CollectionMetadataGenerator.addOneToManyAttached(CollectionMetadataGenerator.java:187) ~[hibernate-envers-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.envers.configuration.metadata.CollectionMetadataGenerator.addCollection(CollectionMetadataGenerator.java:169) ~[hibernate-envers-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.envers.configuration.metadata.AuditMetadataGenerator.addValueInSecondPass(AuditMetadataGenerator.java:223) ~[hibernate-envers-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.envers.configuration.metadata.AuditMetadataGenerator.addValue(AuditMetadataGenerator.java:245) ~[hibernate-envers-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.envers.configuration.metadata.AuditMetadataGenerator.addProperties(AuditMetadataGenerator.java:258) ~[hibernate-envers-4.2.0.Final.jar:4.2.0.Final] 

PS Tôi cố gắng thêm @AuditMappedBy(mappedBy = "product") để sản phẩm:

play.api.UnexpectedException: Unexpected exception[PersistenceException: [PersistenceUnit: defaultPersistenceUnit] Unable to build EntityManagerFactory] 
    at play.core.ReloadableApplication$$anonfun$get$1$$anonfun$1.apply(ApplicationProvider.scala:142) ~[play_2.10-2.1.1.jar:2.1.1] 
    at play.core.ReloadableApplication$$anonfun$get$1$$anonfun$1.apply(ApplicationProvider.scala:106) ~[play_2.10-2.1.1.jar:2.1.1] 
    at scala.Option.map(Option.scala:145) ~[scala-library.jar:na] 
    at play.core.ReloadableApplication$$anonfun$get$1.apply(ApplicationProvider.scala:106) ~[play_2.10-2.1.1.jar:2.1.1] 
    at play.core.ReloadableApplication$$anonfun$get$1.apply(ApplicationProvider.scala:104) ~[play_2.10-2.1.1.jar:2.1.1] 
    at scala.util.Either$RightProjection.flatMap(Either.scala:523) [scala-library.jar:na] 
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: defaultPersistenceUnit] Unable to build EntityManagerFactory 
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:930) ~[hibernate-entitymanager-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:904) ~[hibernate-entitymanager-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:72) ~[hibernate-entitymanager-4.2.0.Final.jar:4.2.0.Final] 
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:63) ~[hibernate-jpa-2.0-api-1.0.1.Final.jar:1.0.1.Final] 
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:47) ~[hibernate-jpa-2.0-api-1.0.1.Final.jar:1.0.1.Final] 
    at play.db.jpa.JPAPlugin.onStart(JPAPlugin.java:35) ~[play-java-jpa_2.10-2.1.1.jar:2.1.1] 
Caused by: org.hibernate.MappingException: @AuditMappedBy points to a property that doesn't exist: models.ProductForm.product 
    at org.hibernate.envers.configuration.ClassesAuditingData.forcePropertyInsertable(ClassesAuditingData.java:84) ~[hibernate-envers-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.envers.configuration.ClassesAuditingData.updateCalculatedFields(ClassesAuditingData.java:70) ~[hibernate-envers-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.envers.configuration.EntitiesConfigurator.configure(EntitiesConfigurator.java:85) ~[hibernate-envers-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.envers.configuration.AuditConfiguration.<init>(AuditConfiguration.java:114) ~[hibernate-envers-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.envers.configuration.AuditConfiguration.getFor(AuditConfiguration.java:164) ~[hibernate-envers-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.envers.event.EnversIntegrator.integrate(EnversIntegrator.java:64) ~[hibernate-envers-4.2.0.Final.jar:4.2.0.Final] 

Sửa

Khi tôi thêm @Audited-ProductForm là sti sẽ gặp lỗi tương tự, bên dưới là dấu vết ngăn xếp mới nhất.

play.api.UnexpectedException: Unexpected exception[PersistenceException: [PersistenceUnit: defaultPersistenceUnit] Unable to build EntityManagerFactory] 
    at play.core.ReloadableApplication$$anonfun$get$1$$anonfun$1.apply(ApplicationProvider.scala:142) ~[play_2.10-2.1.1.jar:2.1.1] 
    at play.core.ReloadableApplication$$anonfun$get$1$$anonfun$1.apply(ApplicationProvider.scala:106) ~[play_2.10-2.1.1.jar:2.1.1] 
    at scala.Option.map(Option.scala:145) ~[scala-library.jar:na] 
    at play.core.ReloadableApplication$$anonfun$get$1.apply(ApplicationProvider.scala:106) ~[play_2.10-2.1.1.jar:2.1.1] 
    at play.core.ReloadableApplication$$anonfun$get$1.apply(ApplicationProvider.scala:104) ~[play_2.10-2.1.1.jar:2.1.1] 
    at scala.util.Either$RightProjection.flatMap(Either.scala:523) [scala-library.jar:na] 
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: defaultPersistenceUnit] Unable to build EntityManagerFactory 
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:930) ~[hibernate-entitymanager-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:904) ~[hibernate-entitymanager-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:72) ~[hibernate-entitymanager-4.2.0.Final.jar:4.2.0.Final] 
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:63) ~[hibernate-jpa-2.0-api-1.0.1.Final.jar:1.0.1.Final] 
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:47) ~[hibernate-jpa-2.0-api-1.0.1.Final.jar:1.0.1.Final] 
    at play.db.jpa.JPAPlugin.onStart(JPAPlugin.java:35) ~[play-java-jpa_2.10-2.1.1.jar:2.1.1] 
Caused by: org.hibernate.MappingException: Unable to read the mapped by attribute for products in models.ProductForm! 
    at org.hibernate.envers.configuration.metadata.CollectionMetadataGenerator.getMappedBy(CollectionMetadataGenerator.java:642) ~[hibernate-envers-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.envers.configuration.metadata.CollectionMetadataGenerator.addOneToManyAttached(CollectionMetadataGenerator.java:187) ~[hibernate-envers-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.envers.configuration.metadata.CollectionMetadataGenerator.addCollection(CollectionMetadataGenerator.java:169) ~[hibernate-envers-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.envers.configuration.metadata.AuditMetadataGenerator.addValueInSecondPass(AuditMetadataGenerator.java:223) ~[hibernate-envers-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.envers.configuration.metadata.AuditMetadataGenerator.addValue(AuditMetadataGenerator.java:245) ~[hibernate-envers-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.envers.configuration.metadata.AuditMetadataGenerator.addProperties(AuditMetadataGenerator.java:258) ~[hibernate-envers-4.2.0.Final.jar:4.2.0.Final] 
+2

Bạn đã từng giải quyết vấn đề này chưa? –

Trả lời

0

Theo như Hibernate có liên quan, bạn có ba thực thể có liên kết một đến nhiều.

Vì vậy, việc thực hiện "tham gia" thực thể được kiểm tra sẽ thực hiện thủ thuật: thêm @Audited đến ProductForm.

+0

Tôi đã thử nó trước đó, '@ Audited' không giúp ích gì. Tôi vẫn nhận được 'Không thể đọc các ánh xạ theo thuộc tính cho các sản phẩm trong models.ProductForm!' Lỗi. Tôi đã cập nhật câu hỏi của mình bằng dấu vết ngăn xếp ... – sami

0

Những gì bạn đang làm là những gì tôi đã thấy được gọi là "thực thể liên kết". Tôi có một vài trong số họ và nói chung tôi khuyên bạn không nên sử dụng id tổng hợp, vì có xu hướng có rất nhiều trường hợp cạnh xung quanh họ. Thay vào đó, hãy cung cấp chỉ mục duy nhất trên cặp khóa ngoại, sau đó thêm các liên kết cho hai thực thể liên quan (và bỏ qua các id của chúng). Dưới đây là một ví dụ bị tước bỏ:

@Entity 
class A { 
    @Id 
    private Integer aId; 

    @OneToMany(mappedBy="a") 
    private AtoB aToB; 
} 

@Entity 
class B { 
    @Id 
    private Integer bId; 

    @ManyToOne 
    @JoinColumn(name="b") 
    private AtoB aToB; 
} 

@Entity 
class AtoB { 

    @Id 
    private Integer aToBId; 

    @ManyToOne 
    @JoinColumn(name="aId") 
    private A a; 

    @OneToMany(mappedBy="aToB") 
    private B b; 
} 

Điều này có ý nghĩa không?

2

Nếu sự cố của bạn gây ra bởi các phím Tổng hợp, hãy cập nhật phiên bản ngủ đông của bạn lên 5.2.2 nếu có thể. Vì lỗi này đã được sửa trong phiên bản này.

Xem: https://hibernate.atlassian.net/browse/HHH-7625

Các vấn đề liên quan