java - 如何映射弱实体 hibernate

标签 java hibernate orm annotations one-to-one

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

我有一张坚固的 table 。

我有一个弱表,它与强表具有一对一的关系。实际上这是 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)

最佳答案

您不必重复 EntityPK 类中的注释,只需匹配表示 OneToManyWeakTable 复合键的简单原始属性,您应该得到像这样的东西(注意 insertableupdatable 属性,修改关联没有意义,因为它是实体实例 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 属性只是作为示例)。

关于java - 如何映射弱实体 hibernate ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31883411/

相关文章:

java - hibernate 中的 native 生成器类

Java - 获取封闭实例

java - 当使用 Hibernate table-per-class 时,如何防止为基类创建表?

python - 使用 SQLAlchemy 思考特征

Java部门并没有按照我的预期进行。

java - 使用java反射实例化接口(interface)?

java - 带有行过滤器的 JTable - 如何仅迭代过滤的行

java - JavaFX 上 Canvas.snapshot() 的替代品

java - 即使客户端没有更改值,hibernate 也会设置脏标志(并发布更新)

java - Play 2.1-快照: Ebean database updates and deletions don't work in Junit test cases