【问题标题】:Unidirectional OneToMany relation with JoinTable - table not generated与 JoinTable 的单向 OneToMany 关系 - 未生成表
【发布时间】:2013-05-07 14:18:03
【问题描述】:

我尝试在 Play Framework 2.1 中使用 JoinTable 创建单向 OneToMany 关系。但是,该框架没有生成“JoinTable”:“transformation_input_files”。奇怪的是,如果我将关系更改为 ManyToMany,则会生成表。代码如下:

所以它是关于一个包含多个 S3Files 的转换类。这是转换文件:

@Entity
@Table(name = "transformations")
public class Transformation extends Model {

    @Id
    public Long id;

    /*...*/

    @OneToMany(cascade = CascadeType.PERSIST)
    @JoinTable(
        name="transformation_input_files",
        joinColumns = @JoinColumn( name="transformation_id"),
        inverseJoinColumns = @JoinColumn( name="input_file_id")
    )
    public List<S3File> inputFiles;
}

这是 S3 文件:

@Entity
@Table(name="s3files")
public class S3File extends Model {

    @Id
    public Long id;

    /*...*/
}

S3Files 用于更多模型,因此不能是双向关系。如果我在@ManyToMany 中更改@OneToMany,它确实会生成连接表,但是,我喜欢坚持使用@OneToMany 关系。

我该如何解决这个问题?我错过了什么吗?

【问题讨论】:

  • 当A和B之间存在一对多的关系(比如说),那么就不需要中间表了。 B 可以将 AId(外键)作为它的列,并且每一行都有一个父 A 指向它。可能是什么原因?
  • 感谢您的评论。这是真的,但是更多类使用 S3Files(在您的示例中为 B 类)。假设有其他类(如 C 和 D)与 B 具有类似的 OneToMany 关系,现在 B 类包含 A、C 和 D 的列。如果 B 由 C 实例创建并拥有,则 A 和 D 为空,甚至不相关.
  • 映射连接表,该表将自动生成,这也被认为是一种好习惯。
  • “映射连接表”到底是什么意思?
  • 是 hbm 文件的行话,但您使用的是注释(我的错...),我的意思是创建一个仅包含多对一关系的实体,我知道这会使它们是双向关系,但我不明白这可能是个问题。

标签: java hibernate playframework-2.1


【解决方案1】:

在一对多关系中,您必须将关系存储在“多”实体中。如果您不想将值存储在 S3File 类中,则必须创建另一个类来连接这两个类。

Example:
@Entity
@Table(name="transformations_ s3files")
public class Relation extends Model {
    @Id
    public Long id;

    @ManyToOne
    public Transformation transformation;        

    @OneToOne
    public S3File file;
}

【讨论】:

  • 感谢您的意见。我将此视为一种“解决方法”,我将解释原因。首先,我不喜欢以与定义实体相同的方式明确实体之间的关系而不是使用关系注释的想法(但我可以接受)。其次,应该以适当的方式解析这种关系方式,因为文档描述了这种关系。 Link to documentaion
  • 这不是一种解决方法,为连接表创建实体很常见,这样,当您通过连接表连接时,您的查询更加灵活,并且您可以添加非键额外列需要。 mkyong.com/hibernate/…
  • Ebean 不支持 OneToMany 关系中的连接表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-15
  • 1970-01-01
  • 2013-11-20
  • 2011-05-23
  • 2019-01-11
相关资源
最近更新 更多