Java 具有JoinTable的单向OneToMany关系-未生成表

Java 具有JoinTable的单向OneToMany关系-未生成表,java,hibernate,playframework-2.1,Java,Hibernate,Playframework 2.1,我试图在Play Framework 2.1中创建一个单向的、一对一的、可连接的关系。但是,框架没有生成“JoinTable”:“transformation\u input\u files”。奇怪的是,如果我将关系更改为ManyToMany,就会生成表。代码如下: 所以它是关于一个包含多个S3文件的转换类。以下是转换文件: @Entity @Table(name = "transformations") public class Transformation extends Model {

我试图在Play Framework 2.1中创建一个单向的、一对一的、可连接的关系。但是,框架没有生成“JoinTable”:“transformation\u input\u files”。奇怪的是,如果我将关系更改为ManyToMany,就会生成表。代码如下:

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

@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文件在更多的模型中使用,因此不能是双向关系。如果我在@ManyToMany中更改@OneToMany,它会生成联接表,但是,我确实喜欢使用@OneToMany关系


我如何解决这个问题?我遗漏了什么吗?

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

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

    @ManyToOne
    public Transformation transformation;        

    @OneToOne
    public S3File file;
}

当A和B之间存在一对多关系时(比如说),就不需要中间表。B可以将AId(外键)作为其列,并且每行都有一个由它指向的父a。原因可能是什么?谢谢你的评论。这是正确的,但是S3文件(在您的示例中是类B)被更多的类使用。假设还有其他类,如C和D,它们与B有类似的一对一关系,现在B类包含a、C和D的列。如果B是由C实例创建和拥有的,a和D是空的,甚至是不相关的。映射联接表,该表将自动生成,这也被认为是一种很好的做法。你所说的“映射联接表”?是hbm文件的行话,但您使用的是anotations(我的坏…),我的意思是创建一个只包含多对一关系的实体,我知道这将使它们成为双向关系,但我不认为这会是一个问题。感谢您的输入。我将此视为一种“解决方法”,并解释原因。首先,我不喜欢以我们所使用的方式明确实体之间的关系定义实体而不是使用关系注释(但我可以接受)。其次,应以适当的方式解析这种关系,因为documentation描述了这种关系。这不是一种解决方法,为联接表创建实体非常常见。这样,当您通过联接表联接时,您的查询更加灵活,并且您可以在需要时添加非键额外列。Ebean不支持在OneToMany关系中的联接表。
Example:
@Entity
@Table(name="transformations_ s3files")
public class Relation extends Model {
    @Id
    public Long id;

    @ManyToOne
    public Transformation transformation;        

    @OneToOne
    public S3File file;
}