2015-02-23 190 views
0

我在JPA關係中遇到了很多問題。我一直在通過互聯網搜索,發現了很多類似於我的案例,但提出的解決方案並不適合我。讓我告訴你的java類映射Oracle表:關聯到這些行動休眠與主鍵作爲外鍵的雙向關聯

@Entity 
@Table(name="CONFIGURATIONS") 
public class Configuration implements Serializable { 

    @Id 
    @Column(name="EAC_ID") 
    private int id; 

    @OneToMany 
    @Cascade({CascadeType.ALL}) 
    @JoinColumn(name="ACT_EAC_ID", nullable=false) 
    private List<Actions> actions; 

    ... 
} 

@Entity 
@Table(name="ACTIONS") 
public class Actions implements Serializable { 

    @Id 
    @Column(name="ACT_ID") 
    private int id; 

    @ManyToOne 
    @JoinColumn(name="ACT_EAC_ID", updatable=false, insertable=false) 
    private Configuration configuration; 

    @OneToMany 
    @Cascade({CascadeType.ALL}) 
    @JoinColumn(name="ECF_ACT_ID", nullable=false) 
    private List<Filter> filters; 

    ... 
} 

@Entity 
@Table(name="FILTERS") 
public class Filter implements Serializable { 

    @EmbeddedId 
    private FilterPK id = new FilterPK(); 

    @ManyToOne 
    @JoinColumn(name = "ECF_ACT_ID", insertable = false, updatable = false) 
    private Actions action = null; 

    ... 
} 

@Embeddable 
public class FilterPK implements Serializable { 

    @Column(name="ECF_KEY", nullable=false, length=100) 
    private String key; 

    @Column(name="ECF_ACT_ID", insertable = false, updatable = false) 
    private int actionId; 

} 

的事情,存儲新配置到數據庫時,其所有相關的動作應該自動存儲的,還有過濾器。

當前,配置及其動作會自動存儲(不含篩選器)。這是我如何實現這一點:

public int createConfiguration(Configuration conf) { 

    for(Actions act : conf.getActions()) { 
     act.setConfiguration(conf); 
    } 

    em.persist(conf); 

    return conf.getId(); 
} 

的問題是,當我添加了過濾器映射,我總是得到這樣的例外:

ERROR [org.jboss.msc.service.fail] (ServerService Thread Pool -- 21)   MSC000001: Failed to start service jboss.persistenceunit.ame: org.jboss.msc.service.StartException in service jboss.persistenceunit."ame": javax.persistence.PersistenceException: [PersistenceUnit: ame] Unable to build EntityManagerFactory 
at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1.run(PersistenceUnitServiceImpl.java:103) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [rt.jar:1.7.0_71] 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [rt.jar:1.7.0_71] 
at java.lang.Thread.run(Thread.java:745) [rt.jar:1.7.0_71] 
at org.jboss.threads.JBossThread.run(JBossThread.java:122) [jboss-threads-2.1.0.Final-redhat-1.jar:2.1.0.Final-redhat-1] 
Caused by: javax.persistence.PersistenceException: [PersistenceUnit:ame] Unable to build EntityManagerFactory 
at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:930) 
at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:904) 
at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:92) 
at org.jboss.as.jpa.service.PersistenceUnitServiceImpl.createContainerEntityManagerFactory(PersistenceUnitServiceImpl.java:200) 
at org.jboss.as.jpa.service.PersistenceUnitServiceImpl.access$600(PersistenceUnitServiceImpl.java:57) 
at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1.run(PersistenceUnitServiceImpl.java:99) 
... 4 more 
**Caused by: org.hibernate.MappingException: Repeated column in mapping for entity: Filter column: ECF_ACT_ID (should be mapped with insert="false" update="false")** 
at org.hibernate.mapping.PersistentClass.checkColumnDuplication(PersistentClass.java:682) 
at org.hibernate.mapping.PersistentClass.checkPropertyColumnDuplication(PersistentClass.java:704) 
at org.hibernate.mapping.PersistentClass.checkColumnDuplication(PersistentClass.java:726) 
at org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:479) 
at org.hibernate.mapping.RootClass.validate(RootClass.java:270) 
at org.hibernate.cfg.Configuration.validate(Configuration.java:1284) 
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1742) 
at org.hibernate.ejb.EntityManagerFactoryImpl.<init>(EntityManagerFactoryImpl.java:94) 
at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:920) 
... 9 more 

有沒有人經歷了同樣的問題的種類?我怎麼能解決這個問題?

在此先感謝您的幫助!

回答

1

您需要的mappedBy添加到您的一對多註釋和刪除加入的一對多邊欄(他們在多對一側已定義)。

public class Configuration 
... 
@OneToMany(mappedBy="configuration") 
private List<Actions> actions; 

您可能還需要去除插入=假,updateble =假

+0

配置和操作之間的關係已經正常工作。問題在於操作 - 過濾器關係。 – 2015-02-24 07:54:25

+0

抱歉不清楚。同樣使用相同的註釋模板對您的操作進行過濾,它就是同一種關係 – Zielu 2015-02-24 11:19:54