1

パブリック スキーマに 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>
4

1 に答える 1

1

解決策は非常に近いと言えます。あなたが言った:

DBをまったく変更できません。Hibernate 4 を使用しています。

したがって、コードとマッピングを変更できると思います。私が正しく、コードとマッピングを変更できる場合inverse: 試した設定:

<bag name="locations" inverse="true">

それを解決する必要があります。この場合の唯一のことは、所有するコレクションに入れるだけでなく、明示的に割り当てる必要があることLocationです。Event

Locationプロパティを持つ必要がありますEvent

public class Location{
    private String locationId;
    private Event event;
    private double lat;
    private double lon;
    //getters and setters
}

マッピングは次のようになります。

<class name="Location" table="location">
  <id name="locationId" column="location_id"/>
  <property name="lat" column="lat"/>
  <property name="lon" column="lon"/>
  <many-to-one name="Event" column="event_id" />
</class>

したがって、コード内で次のことを行う場合:

event.locations.add(location);
location.event = event;

その後、INSERTS のみで動作するはずです。逆に言えば、子はすべてのことを単独で行うため、親について知る必要があります。

于 2012-11-15T15:52:00.300 に答える