Отображение Hibernate «многие ко многим» не сохраняется в сводной таблице - PullRequest
2 голосов
/ 20 мая 2010

У меня возникли проблемы с сохранением многих-многих отношений в сводной таблице.

Способ создания pojos, к сожалению, довольно долгий процесс, который охватывает несколько различных потоков, которые работают с (до этого момента не сохраненным) объектом, пока он не будет окончательно сохранен. Я связываю связанные объекты друг с другом сразу после их создания, и при отладке я вижу Список связанных объектов, заполненный их соответствующими объектами. Так что в принципе все хорошо в этом вопросе. Когда я сохраняю объект, все сохраняется, кроме отношений в сводной таблице.

файлы сопоставления:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.thebeansgroup.jwinston.plugin.orm.hibernate.object">
    <class name="ShowObject" table="show_object">
        <id name="id">
            <generator class="native" />
        </id>
        <property name="name" />
        <set cascade="all" inverse="true" name="venues" table="venue_show">
            <key column="show_id"/>
            <many-to-many class="VenueObject"/>
        </set>
    </class>
</hibernate-mapping>

и другие

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.thebeansgroup.jwinston.plugin.orm.hibernate.object">
    <class name="VenueObject" table="venue_object">
        <id name="id">
            <generator class="native"/>
        </id>
        <property name="name"/>
        <property name="latitude" type="integer"/>
        <property name="longitude" type="integer"/>
        <set cascade="all" inverse="true" name="shows" table="venue_show">
            <key column="venue_id"/>
            <many-to-many class="ShowObject"/>
        </set>
    </class>
</hibernate-mapping>

POJOs:

public class ShowObject extends OrmObject
{

    private Long id;
    private String name;
    private Set venues;

    public ShowObject()
    {
    }

    public Long getId()
    {
        return id;
    }

    public void setId(Long id)
    {
        this.id = id;
    }

    public String getName()
    {
        return name;
    }

    public void setName(String name)
    {
        this.name = name;
    }

    public Set getVenues()
    {
        return venues;
    }

    public void setVenues(Set venues)
    {
        this.venues = venues;
    }
}

и другие:

public class VenueObject extends OrmObject
{

    private Long id;
    private String name;
    private int latitude;
    private int longitude;
    private Set shows = new HashSet();

    public VenueObject()
    {
    }

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    public Long getId()
    {
        return id;
    }

    public void setId(Long id)
    {
        this.id = id;
    }

    public int getLatitude()
    {
        return latitude;
    }

    public void setLatitude(int latitude)
    {
        this.latitude = latitude;
    }

    public int getLongitude()
    {
        return longitude;
    }

    public void setLongitude(int longitude)
    {
        this.longitude = longitude;
    }

    public String getName()
    {
        return name;
    }

    public void setName(String name)
    {
        this.name = name;
    }

    public Set getShows()
    {
        return shows;
    }

    public void setShows(Set shows)
    {
        this.shows = shows;
    }
}

Может ли проблема быть связана с отсутствием аннотаций?

1 Ответ

2 голосов
/ 20 мая 2010

Пара вещей, чтобы попробовать:

  1. У вас есть inverse="true" на обоих концах "многие ко многим". Это должно быть только на одном конце.

  2. Сделайте ваши сеты не ленивыми.

  3. Вы не указали column свойство для тега многие ко многим.

Так что в конце это должно выглядеть примерно так:

<class name="ShowObject" table="show_object">
    ...
    <set lazy="false" cascade="all" name="venues" table="venue_show">
        <key column="show_id"/>
        <many-to-many class="VenueObject" column="venue_id" />
    </set>
</class>

<class name="VenueObject" table="venue_object">
    ...
    <set lazy="false" cascade="all" inverse="true" name="shows" table="venue_show">
        <key column="venue_id"/>
        <many-to-many class="ShowObject" column="show_id"/>
    </set>
</class>
...