Hibernate中的多1:多关系

Hibernate中的多1:多关系,hibernate,orm,mapping,one-to-many,Hibernate,Orm,Mapping,One To Many,如何配置同一实体的多个一对多关系 考虑两个类:男孩和玩具。它们看起来如下所示 class Boy { @OneToMany(mappedBy='ownedBy',fetch=FetchType.EAGER, cascade=CascadeType.ALL) private List<Toy> bikes; ... @OneToMany(mappedBy='ownedBy',fetch=FetchType.EAGER, cascade=CascadeTy

如何配置同一实体的多个一对多关系

考虑两个类:男孩和玩具。它们看起来如下所示

class Boy {
    @OneToMany(mappedBy='ownedBy',fetch=FetchType.EAGER, cascade=CascadeType.ALL)
    private List<Toy> bikes;
    ...
    @OneToMany(mappedBy='ownedBy',fetch=FetchType.EAGER, cascade=CascadeType.ALL)
    private List<Toy> cars;
    ...
我知道这个配置是错误的。但是我不知道这里需要配置什么。 对于@OneToMany和@ManyToOne注释,两侧应进行什么配置

在将“mappedBy”添加到注释之前,我收到了以下异常消息

java.sql.SQLException: Field 'cars_Id' doesn't have a default value
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4096)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4028)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2490)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2651)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2683)
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2144)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2444)
    at com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:1997)
但在注释中没有添加“mappedBy”时,创建了一个类似“boy_toy”的联接表。添加后,我看不到在数据库中创建的表

使现代化 此外,boy_toy table有三列,即boy_id、cars_id和bikes_id。但理想情况下,它应该类似于boy_id a NOTNULL和其他可为空的列。但生成的所有列都不可为null。我试图从注释中删除“mappedBy”,并手动编辑表结构,使cars\u id和bikes\u id为空。这真是个奇迹

所以现在,我唯一剩下的问题是
我们如何指令hibernate配置具有可空列和不可空列的联接表?

使用继承,在BOY和TOY之间创建1-N关系,使用继承策略SINGLE_table。要仅检索连接到男孩的自行车或汽车,请使用polymorhic查询

奖励:即使自行车和汽车是不同级别的,上述设置也不会起作用。原因是,fetch=FetchType.EAGER不能有多个1-N关系。更多关于这方面的信息,请访问我的博客:

编辑:多态查询

简单:

entityManager.createQuerySELECT toy FROM toy toy;//返回所有玩具实例,无论是自行车还是汽车

entityManager.createQuerySELECT bike FROM bike bike;//仅返回玩具的自行车类型实例

在上面的表达式中,您显然可以使用所有其他JPQL构造,如WHERE、JOIN等


如果您碰巧使用JPA2.0,那么在多态性方面有一些新功能,如类型检查和类型转换,请参见此处:

您的映射没有意义,为什么要创建两个相同项的集合?如果要对同一类型进行多个映射,则需要为它们指定唯一的mappedBy。换句话说,您不能按ownedBy映射这两个集合,Hibernate将不知道该做什么,特别是在合并/持久化的情况下。实际上我没有任何这样做的要求。我刚刚用hibernate做了一些实验。我了解到“mappedBy”并不能解决问题。删除“mappedBy”创建了一个包含BOY\u ID、BIKES\u ID和CARS\u ID列的连接表BOY\u TOY;我想知道一种方法,它能告诉hibernate使BIKES\u ID和CARS\u ID字段为空。如果你能找到一些关于多态查询的文章,那就太好了。
java.sql.SQLException: Field 'cars_Id' doesn't have a default value
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4096)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4028)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2490)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2651)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2683)
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2144)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2444)
    at com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:1997)