【问题标题】:How to map weak entity hibernate如何映射弱实体休眠
【发布时间】:2015-10-31 05:36:44
【问题描述】:

我在数据库中有以下关系:

我有一张坚固的桌子。

我有一张与强表有一对一关系的弱表。真的是 0 对 1 的关系,因为强表并不总是弱表中的一行。要识别这个弱表,强表的ID就足够了。

最后我有另一个弱表,与第一个弱实体的 ManyToOne 关系。它需要OneToOneWeakEntity的id(也就是强表的id),和自己的id。这就像 OneToOneWeakTable 的历史。

我想在 Hibernate 中映射,但我不知道该怎么做。

现在我有以下代码:

@Entity
@Table(name="table")
public class Table {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name="id_table")
    private Integer idTable;
    private String otherAtributes;

    ....
}


@Entity
@Table(name="oneToOneWeakTable")
public class OneToOneWeakEntity {   

    @OneToOne(cascade = CascadeType.ALL, optional=false) 
    @Id
    @JoinColumn(name="table_id_table")
    private Table table;
    private String otherAtributes;

    ....
}


@Entity
@Table(name="oneToManyWeakTable")
@IdClass(EntityPk.class)
public class OneToManyWeakTable {

    @Id
    @ManyToOne
    @JoinColumn(name="table_id_table")
    private OneToOneWeakEntity oneToOneWeakEntity;
    @Id
    @Column(name="own_id")
    private String ownId;
    private String otherAtributes;

    ....
}

class EntityPk {

    @Id
    @ManyToOne
    @JoinColumn(name="table_id_table")
    private OneToOneWeakEntity oneToOneWeakEntity;
    @Id
    @Column(name="own_id")
    private String ownId;
    private String otherAtributes;

    ....

}

我的问题是当我尝试运行我的应用程序时,因为我有这个部署错误:

Caused by: org.hibernate.AnnotationException: A Foreign key refering package.OneToOneWeakEntity from package.OneToManyWeakTable has the wrong number of column. should be 0
at org.hibernate.cfg.annotations.TableBinder.bindFk(TableBinder.java:502)
at org.hibernate.cfg.ToOneFkSecondPass.doSecondPass(ToOneFkSecondPass.java:117)
at org.hibernate.cfg.Configuration.processFkSecondPassInOrder(Configuration.java:1518)
at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1422)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1846)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1930)

如何映射这种关系??

谢谢!

编辑:我也尝试用它来映射 OneToOneWeakTable:

@OneToOne(cascade = CascadeType.ALL, optional=false) 
@PrimaryKeyJoinColumn
@Id
@JoinColumn(name="table_id_table")
private Table table;

在这种情况下,我在尝试部署时也遇到了错误,但出现了不同的异常:

Caused by: java.lang.NullPointerException
at org.hibernate.cfg.Ejb3JoinColumn.checkReferencedColumnsType(Ejb3JoinColumn.java:568)
at org.hibernate.cfg.BinderHelper.createSyntheticPropertyReference(BinderHelper.java:258)
at org.hibernate.cfg.ToOneFkSecondPass.doSecondPass(ToOneFkSecondPass.java:116)
at org.hibernate.cfg.Configuration.processFkSecondPassInOrder(Configuration.java:1518)
at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1422)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1846)

【问题讨论】:

    标签: java hibernate orm annotations one-to-one


    【解决方案1】:

    你不必重复EntityPK类中的注释,你只需要匹配代表OneToManyWeakTable的复合键的简单原始属性,你应该得到这样的东西(注意insertable和@ 987654325@属性,修改关联没有意义,因为它是实体实例pk的一部分),

    @Entity
    @Table(name="oneToManyWeakTable")
    @IdClass(EntityPk.class)
    public class OneToManyWeakTable {
    
        @Id
        @Column(name="table_id_table")
        private long weakEntity
    
        @ManyToOne
        @JoinColumn(name="table_id_table", insertable=false, updatable=false)
        private OneToOneWeakEntity oneToOneWeakEntity;
    
        @Id
        @Column(name="own_id")
        private String ownId;
    
        private String otherAtributes;
    
        ....
    }
    
    class EntityPk {
    
        private long weakEntity;
    
        private String ownId;
        ....
    }
    
    @Entity
    @Table(name="oneToOneWeakTable")
    public class OneToOneWeakEntity {   
    
        @OneToOne
        @Id
        @JoinColumn(name="table_id_table")
        private Table table;
    
        private String otherAtributes;
    
        ....
    }
    

    也可以看看official doc of compound primary keys

    编辑:添加OneToOneWeakTable 假设您使用的是JPA 2,在您的编辑中您正在混合注释。检查共享实体的 id 文件和属性,必须是相同的类型(注意我使用long 作为weakEntity 属性的示例)。

    【讨论】:

    • 我试过这个,但我有与第二种情况相同的例外。我认为问题在于 OneToOneWeakEntity 中间的实体。如果这个实体有一个 Integer 作为 Id,它就会运行,并且如果关系都是 ManyToOne(第 2 个与第 1 个实体,第 3 个与第 2 个实体)也运行。
    猜你喜欢
    • 1970-01-01
    • 2019-12-03
    • 2020-12-18
    • 2021-11-11
    • 2016-10-18
    • 1970-01-01
    • 2014-11-19
    • 2017-01-22
    • 1970-01-01
    相关资源
    最近更新 更多