0

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

考虑两个班级 Boy 和 Toy。它们看起来如下所示

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

class Toy {
    @ManyToOne
    private Boy ownedBy;
    ...

我知道这个配置是错误的。但是我不知道这里需要配置什么。两边的@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 表也有三列,即 boy_id、cars_id 和 bikes_id。但理想情况下,它应该像 boy_id 一个 not null 和其他可为空的列。但是生成的所有列都不可为空。我试图从注释中删除“mappedBy”并手动编辑表结构以使cars_id 和bikes_id 可以为空。它就像一个奇迹。

所以现在,我唯一剩下的问题是

我们如何指示 hibernate 配置一个带有可空列和不可空列的连接表?

4

1 回答 1

0

使用继承,在 BOY 和 TOY 之间建立 1-N 关系,采用继承策略 SINGLE_TABLE。要仅检索连接到 Boy 的 Bikes 或 Cars,请使用多态查询。

奖励:即使自行车和汽车是不同的类别,上述设置也不起作用。原因是,您不能使用 fetch=FetchType.EAGER 建立多个 1-N 关系。在我的博客中了解更多信息:MultipleBagFetchException 和 Java 平等

编辑:多态查询

简单的:

entityManager.createQuery("从玩具玩具中选择玩具"); // 返回所有 Toy 实例,无论是自行车还是汽车

entityManager.createQuery("SELECT bike FROM Bike bike"); // 只返回 Bike 类型的玩具实例

在上述表达式中,您显然可以使用所有其他 JPQL 构造,例如 WHERE、连接等。

如果您碰巧使用 JPA2.0,则有一些关于多态性的新功能,例如类型检查和类型转换,请参见此处:http ://wiki.eclipse.org/EclipseLink/Release/2.1.0/JPAQueryEnhancements

于 2012-06-23T16:20:32.063 回答