誰かがこれで私を助けてくれることを願っています。
JPA / Hibernate を使用して、2 つのエンティティ間の双方向結合を作成しようとしています。
データベースの列名が値オブジェクトの属性名と一致する必要があるという事実を示しているようですが、これは奇妙に思えます。明確にすることで、誰かが私を助けてくれることを願っています。
残念ながら、私はいくつかの輝かしい火花が列名に意味のない名前を付けている立場にあります。 私は列名を変更する立場にありません-信じてください-できれば-そうします!
だからここに私のスキーマがどのように見えるかです:-
Customer
========
CS1 -- The ID column
CS2 -- Customer Description
ContactDetails
==============
CD1 -- The ID column
CD2 -- The FK to the Customer table
...
ご想像のとおり、アプリケーション内に 2 つの値オブジェクトがあります。これらは次のようになります。
Customer.java
@Entity
@Table("Customer")
public class Customer {
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "CS1", nullable=false, columnDefinition="INTEGER")
private int id;
}
@OneToMany (cascade = CascadeType.ALL, mappedBy = "customerId", fetch = FetchType.EAGER)
private Set <ContactDetailsVO> contactDetails = new HashSet <CustomerDetailsVO> ();
}
ContactDetails.java
public class ContactDetails {
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "CD1", nullable=false, columnDefinition="INTEGER")
private int id;
@Column(name = "CD2")
long customerId;
@ManyToOne(optional = false)
@JoinColumn(name = "customerId", referencedColumnName = "id")
private CustomerVO customer;
public CustomerVO getCustomer() {
return customer;
}
public void setCustomer(CustomerVO customer) {
this.customer = customer;
}
}
残念ながら、マッピング関係のためにオブジェクト属性名を参照するこのアプローチは機能していないようです-起動時に次のようになります:-
Caused by: org.hibernate.HibernateException: Missing column: customerId in TestDB.dbo.ContactDetails
at org.hibernate.mapping.Table.validateColumns(Table.java:276)
at org.hibernate.cfg.Configuration.validateSchema(Configuration.java:131
したがって、代わりに実際のテーブル列名を使用するようにマッピングを変更すると、次のようになります。
Customer.java
@Entity
@Table("Customer")
public class Customer {
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "CS1", nullable=false, columnDefinition="INTEGER")
private int id;
}
@OneToMany (cascade = CascadeType.ALL, mappedBy = "CD2", fetch = FetchType.EAGER)
private Set <ContactDetailsVO> contactDetails = new HashSet <CustomerDetailsVO> ();
}
ContactDetails.java
public class ContactDetails {
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "CD1", nullable=false, columnDefinition="INTEGER")
private int id;
@Column(name = "CD2")
long customerId;
@ManyToOne(optional = false)
@JoinColumn(name = "CD2", referencedColumnName = "CS1")
private CustomerVO customer;
public CustomerVO getCustomer() {
return customer;
}
public void setCustomer(CustomerVO customer) {
this.customer = customer;
}
}
次に、次を取得します。
Caused by: org.hibernate.MappingException: Could not determine type for:
com.myCompany.model.vo.CustomerVO, at table: ContactDetails, for columns:
[org.hibernate.mapping.Column(customer)]
at org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:306)
私が言うように、これを解決する明白な方法は、テーブルの列名と同じようにオブジェクトの属性に名前を付けることですが、テーブルの列に名前を付ける愚かさを考えると、アプリケーションをそれから分離したいと思います。
誰かがこの奇妙な行動に光を当てるのを手伝ってもらえますか?
前もって感謝します。