パブリック スキーマに 2 つのテーブル イベントと場所があります。「その他」のスキーマに、パブリック テーブルから継承する 2 つのテーブルがあります。このセットアップを模倣する 4 つのクラスがあります (Event、Location、OtherEvent、および OtherLocation)。Hibernate を使用して OtherEvent & Other Location を永続化しようとしています。
すべてのイベントには 1 つ以上の場所があります。イベントでは場所は意味がありません。
OtherEvent を作成し、OtherLocation を追加して保存しようとすると、hibernate は OtherEvent を other.event に挿入し、hibernate は OtherLocation を other.location (event_id を含む) に挿入します。その後、休止状態は次のことを試みます: UPDATE public.location set event_id=? 場所=? public.location に対する権限がないため、これは失敗します。この更新を行わないようにするにはどうすればよいですか? または、other.location テーブルで更新を行うように変更します。
public.hbm.xml を変更して変更してみました:
<bag name="locations">
に
<bag name="locations" inverse="true">
これは update ステートメントを実行しませんが、other.location への挿入には event_id 列が含まれません (not null で ConstraintViolation が発生します)。これは、Location に Event オブジェクトへの参照がないためです。
DBをまったく変更できません。Hibernate 4 を使用しています。
関連するすべての構成は次のとおりです。 パブリック クラス:
public class Event{
private String eventId;
private List<Location> locations;
//getters & setters
}
public class Location{
private String locationId;
private double lat;
private double lon;
//getters and setters
}
公開テーブル:
create table public.event{
event_id varchar PRIMARY KEY,
event_name varchar,
)
create table public.location(
location_id varchar PRIMARY KEY,
event_id varchar NOT NULL, --foreign key to public.event.event_id
lat double,
lon double
)
public.hbm.xml:
<hibernate-mapping schema="public">
<class name="Event" table="event">
<id name="eventId" column="event_id"/>
<bag name="locations">
<key column="event_id" not-null="true"/>
<one-to-many class="Location">
</bag>
</class>
<class name="Location" table="location">
<id name="locationId" column="location_id"/>
<property name="lat" column="lat"/>
<property name="lon" column="lon"/>
</class>
</hibernate-mapping>
その他のテーブル:
create table other.event inherits public.event(
other_information varchar
)
create table other.location inherits public.location(
other_loc_information varchar
)
その他のクラス:
public class OtherEvent extends Event{
private String otherInformation;
//getter & setter
}
public class OtherLocation extends Location{
private String otherLocInformation;
//getter & setter
}
other.hbm.xml:
<hibernate-mapping schema="other">
<union-subclass name="OtherEvent" extends="Event" table="event">
<property name="otherInformation" column="other_information"/>
</union-subclass>
<union-subclass name="OtherLocation" extends="Location" table="location">
<property name="otherLocInformation" column="other_loc_information"/>
</union-subclass>
</hibernate-mapping>