![](/img/trans.png)
[英]How do I disable Hibernate foreign key constraint on a bidirectional association?
[英]hibernate bidirectional association with primary key as foreign key
我與JPA關系有很多問題。 我一直在互聯網上搜索,發現很多與我相似的案例,但是建議的解決方案對我不起作用。 讓我向您展示映射Oracle表的Java類:
@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
有人遇到過類似的問題嗎? 我該如何解決?
在此先感謝您的幫助!!!
您需要向您的OneToMany批注中添加maptedBy,並刪除單邊側的聯接列(它們已經在多對側定義)。
public class Configuration
...
@OneToMany(mappedBy="configuration")
private List<Actions> actions;
您可能還想刪除insertable = false,updateble = false
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.