【问题标题】:Hibernate doesn't use the name argument for @JoinTableHibernate 不使用@JoinTable 的名称参数
【发布时间】:2014-12-24 00:37:11
【问题描述】:

我有一个小问题,我有一个超类在 PostgreSQL 中为根表定义一个实体。

这个类有2个继承表/类实体,我想在其中添加一个@OneToOne连接表关联:

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@Table(name = "equipement")
public abstract class Equipement
{
   ....
}

@Entity
@Table(name = "nod")
public class Nod extends Equipement
{
    protected Cross cross;

    @OneToOne(cascade = CascadeType.ALL, optional = true, fetch = FetchType.EAGER)
    @JoinTable(name = "assoc_nod_cross", joinColumns = @JoinColumn(name = "nod_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "cross_id", referencedColumnName = "id"))
    public Cross getCross()
    {
        return cross;
    }

    ...
}

@Entity
@Table(name = "cross")
public class Cross extends Equipement
{
    protected Nod nod;

    @OneToOne(cascade = CascadeType.ALL, optional = true, fetch = FetchType.EAGER)
    @JoinTable(name = "assoc_nod_cross", joinColumns = @JoinColumn(name = "cross_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "nod_id", referencedColumnName = "id"))
    public Nod getNod()
    {
        return nod;
    }

    ...
}

当列出所有 Nod 或 Cross 实体时,Hibernate 想在错误的表中搜索 inverseJoinColumns 字段,它不使用名称(assoc_nod_cross),我什至可以放任何东西。

示例:

Hibernate: select cross0_.id as id1_7_, cross0_.nod_id as nod_id2_1_ from cross cross0_

javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not extract ResultSet
...
Caused by: org.postgresql.util.PSQLException: ERROR: column cross0_.node_id does not exist

这是因为@Inheritance 策略的问题吗?这是休眠中的错误吗?我的实体定义有问题吗?

添加信息:我尝试切换到 EclipseLink 以检查它是否是休眠错误/限制,或者我是否在某个地方出错。而且 EclipseLink 运行良好。

【问题讨论】:

    标签: java hibernate postgresql jpa


    【解决方案1】:

    这是CrossNod 之间的双向关系吗?如果是这样,您不必以这种方式注释关系的双方。这可能会混淆hibernate。 Here 是它工作的一个例子。我认为应该这样做

    @Entity
    @Table(name = "nod")
    public class Nod extends Equipement
    {
        protected Cross cross;
    
        @OneToOne(cascade = CascadeType.ALL, optional = true, fetch = FetchType.EAGER)
        @JoinTable(name = "assoc_nod_cross", joinColumns = @JoinColumn(name = "nod_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "cross_id", referencedColumnName = "id"))
        public Cross getCross()
        {
            return cross;
        }
    
        ...
    }
    
    @Entity
    @Table(name = "cross")
    public class Cross extends Equipement
    {
        protected Nod nod;
    
        @OneToOne(mappedBy = "cross")
        public Nod getNod()
        {
            return nod;
        }
    
        ...
    }
    

    【讨论】:

    • 我一直在想这样的问题,但是即使Cross实体上没有JoinTable注解,也会出现同样的错误。
    • 即使是mappedBy = "cross"?
    • 是的,我改变了它,并保留它,因为它显然更好。但它继续对我失败。
    • 看来这个奇怪的问题和Hibernate有关。 eclipselink没问题。
    • 是的,我看到了您的编辑。如果不是太多工作,您可以在没有继承的实体上尝试相同的设置,看看它是否有任何区别。顺便说一句,您使用的是哪个休眠版本?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-21
    • 2012-07-13
    • 1970-01-01
    相关资源
    最近更新 更多