【问题标题】:Hibernate many-to-many mapping not saved in pivot table休眠多对多映射未保存在数据透视表中
【发布时间】:2010-05-20 13:40:50
【问题描述】:

我在将多对多关系保存到数据透视表时遇到问题。

不幸的是,创建 pojo 的方式是一个相当长的过程,它跨越了几个不同的线程,这些线程在(到目前为止未保存的)对象上工作,直到它最终被持久化。我在创建相关对象后立即将它们相互关联,并且在调试时我可以看到相关对象的列表填充了它们各自的对象。所以基本上一切都很好。当我持久化对象时,除了数据透视表中的关系之外,所有内容都会被保存。

映射文件:

<?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>

pojo:

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;
    }
}

问题可能与缺少注释有关吗?

【问题讨论】:

  • 通过两个类定义你把 table="venue_show" 这是正确的吗?
  • 尽管如此,我假设 table 属性指定了数据透视表。但是我可能错了,因为我对 Hibernate 很陌生

标签: java hibernate multithreading annotations pojo


【解决方案1】:

尝试几件事:

  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>

【讨论】:

    猜你喜欢
    • 2023-03-14
    • 2011-12-10
    • 2011-04-07
    • 1970-01-01
    • 2012-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多