Java Ebean与join的多对多关系失败

Java Ebean与join的多对多关系失败,java,playframework-2.0,ebean,Java,Playframework 2.0,Ebean,我正在喝一些杜松子酒,我正在吃一些补品,这是一种多对多的关系。现在我还有一张桌子。它只有两个键,这两个键都是外来的,都是来自汤尼和杜松子酒 我想把所有的杜松子酒和相应的补品一起取出来。我的db create语句如下所示: CREATE TABLE `tonic` ( `idTonic` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(100) DEFAULT NULL, `type` varchar(360) DEFAULT NULL,

我正在喝一些杜松子酒,我正在吃一些补品,这是一种多对多的关系。现在我还有一张桌子。它只有两个键,这两个键都是外来的,都是来自汤尼和杜松子酒

我想把所有的杜松子酒和相应的补品一起取出来。我的db create语句如下所示:

CREATE TABLE `tonic` (
  `idTonic` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) DEFAULT NULL,
  `type` varchar(360) DEFAULT NULL,
  `ingredient` varchar(1440) DEFAULT NULL,
  `origin` varchar(1440) DEFAULT NULL,
  `picture_link` varchar(360) DEFAULT NULL,
  `aroma` varchar(360) DEFAULT NULL,
  PRIMARY KEY (`idTonic`)
) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8;


CREATE TABLE `gin` (
  `idGin` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) DEFAULT NULL,
  `picture_link` varchar(360) DEFAULT NULL,
  `origin` varchar(1440) DEFAULT NULL,
  `ingredient` varchar(1440) DEFAULT NULL,
  `aroma` varchar(360) DEFAULT NULL,
  `alc_percentage` double DEFAULT NULL,
  `type` varchar(360) DEFAULT NULL,
  PRIMARY KEY (`idGin`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

CREATE TABLE `gin2tonic` (
  `id_gin` int(11) DEFAULT NULL,
  `id_tonic` int(11) DEFAULT NULL,
  KEY `idGin_idx` (`id_gin`),
  KEY `idTonic_idx` (`id_tonic`),
  CONSTRAINT `fk_gin2tonic_idGin` FOREIGN KEY (`id_gin`) REFERENCES `gin` (`idGin`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `fk_gin2tonic_idTonic` FOREIGN KEY (`id_tonic`) REFERENCES `tonic` (`idTonic`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
@Entity
public class Gin extends Model {
    @Id
    @Column(name="idGin")
    private Integer idGin;
    private String aroma;
    ...// some other vars from the database not important

    @ManyToMany
    @JoinTable(name="gin2tonic")
    private List<Tonic> tonics;

        public static Finder<Integer, Gin> find = new Finder<>(
            Integer.class, Gin.class
    );
}


@Entity
public class Tonic extends Model {
    @Id
    @Column(name="idTonic")
    private Integer idTonic;

    private String aroma;

    // some other vars from the database not important


    @ManyToMany(mappedBy = "tonics")
    public List<Tonic> tonics;

    public static Finder<Integer, Tonic> find = new Finder<>(
            Integer.class, Tonic.class
    );

}
List<Gin> gins = Gin.find.all();
for(Gin x : gins){
    System.out.println("idGin: " + x.getIdGin());
    System.out.println("Tonics: "+ x.getTonics());
    System.out.println("---------------------");
}
在我的java类中,我认为我可以这样做:

CREATE TABLE `tonic` (
  `idTonic` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) DEFAULT NULL,
  `type` varchar(360) DEFAULT NULL,
  `ingredient` varchar(1440) DEFAULT NULL,
  `origin` varchar(1440) DEFAULT NULL,
  `picture_link` varchar(360) DEFAULT NULL,
  `aroma` varchar(360) DEFAULT NULL,
  PRIMARY KEY (`idTonic`)
) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8;


CREATE TABLE `gin` (
  `idGin` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) DEFAULT NULL,
  `picture_link` varchar(360) DEFAULT NULL,
  `origin` varchar(1440) DEFAULT NULL,
  `ingredient` varchar(1440) DEFAULT NULL,
  `aroma` varchar(360) DEFAULT NULL,
  `alc_percentage` double DEFAULT NULL,
  `type` varchar(360) DEFAULT NULL,
  PRIMARY KEY (`idGin`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

CREATE TABLE `gin2tonic` (
  `id_gin` int(11) DEFAULT NULL,
  `id_tonic` int(11) DEFAULT NULL,
  KEY `idGin_idx` (`id_gin`),
  KEY `idTonic_idx` (`id_tonic`),
  CONSTRAINT `fk_gin2tonic_idGin` FOREIGN KEY (`id_gin`) REFERENCES `gin` (`idGin`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `fk_gin2tonic_idTonic` FOREIGN KEY (`id_tonic`) REFERENCES `tonic` (`idTonic`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
@Entity
public class Gin extends Model {
    @Id
    @Column(name="idGin")
    private Integer idGin;
    private String aroma;
    ...// some other vars from the database not important

    @ManyToMany
    @JoinTable(name="gin2tonic")
    private List<Tonic> tonics;

        public static Finder<Integer, Gin> find = new Finder<>(
            Integer.class, Gin.class
    );
}


@Entity
public class Tonic extends Model {
    @Id
    @Column(name="idTonic")
    private Integer idTonic;

    private String aroma;

    // some other vars from the database not important


    @ManyToMany(mappedBy = "tonics")
    public List<Tonic> tonics;

    public static Finder<Integer, Tonic> find = new Finder<>(
            Integer.class, Tonic.class
    );

}
List<Gin> gins = Gin.find.all();
for(Gin x : gins){
    System.out.println("idGin: " + x.getIdGin());
    System.out.println("Tonics: "+ x.getTonics());
    System.out.println("---------------------");
}
@实体
公共类模型{
@身份证
@列(name=“idGin”)
私有整数idGin;
私家串香;
…//数据库中的其他一些变量不重要
@许多
@可接合(name=“gin2tonic”)
私人列表补品;
公共静态查找器find=新查找器(
Integer.class,Gin.class
);
}
@实体
公共类模型{
@身份证
@列(name=“idTonic”)
私有整数idTonic;
私家串香;
//数据库中的其他一些变量并不重要
@许多(mappedBy=“tonics”)
公共列表补品;
公共静态查找器find=新查找器(
Integer.class,Tonic.class
);
}
然后我执行如下操作:

 List<Gin> gins = Gin.find.all();
List gins=Gin.find.all();
我得到的错误如下:

有人能帮我吗

编辑:

多亏了singhakash,错误得以解决,但是,当我想像这样打印列表时,我现在得到了BeanList延期:

CREATE TABLE `tonic` (
  `idTonic` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) DEFAULT NULL,
  `type` varchar(360) DEFAULT NULL,
  `ingredient` varchar(1440) DEFAULT NULL,
  `origin` varchar(1440) DEFAULT NULL,
  `picture_link` varchar(360) DEFAULT NULL,
  `aroma` varchar(360) DEFAULT NULL,
  PRIMARY KEY (`idTonic`)
) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8;


CREATE TABLE `gin` (
  `idGin` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) DEFAULT NULL,
  `picture_link` varchar(360) DEFAULT NULL,
  `origin` varchar(1440) DEFAULT NULL,
  `ingredient` varchar(1440) DEFAULT NULL,
  `aroma` varchar(360) DEFAULT NULL,
  `alc_percentage` double DEFAULT NULL,
  `type` varchar(360) DEFAULT NULL,
  PRIMARY KEY (`idGin`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

CREATE TABLE `gin2tonic` (
  `id_gin` int(11) DEFAULT NULL,
  `id_tonic` int(11) DEFAULT NULL,
  KEY `idGin_idx` (`id_gin`),
  KEY `idTonic_idx` (`id_tonic`),
  CONSTRAINT `fk_gin2tonic_idGin` FOREIGN KEY (`id_gin`) REFERENCES `gin` (`idGin`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `fk_gin2tonic_idTonic` FOREIGN KEY (`id_tonic`) REFERENCES `tonic` (`idTonic`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
@Entity
public class Gin extends Model {
    @Id
    @Column(name="idGin")
    private Integer idGin;
    private String aroma;
    ...// some other vars from the database not important

    @ManyToMany
    @JoinTable(name="gin2tonic")
    private List<Tonic> tonics;

        public static Finder<Integer, Gin> find = new Finder<>(
            Integer.class, Gin.class
    );
}


@Entity
public class Tonic extends Model {
    @Id
    @Column(name="idTonic")
    private Integer idTonic;

    private String aroma;

    // some other vars from the database not important


    @ManyToMany(mappedBy = "tonics")
    public List<Tonic> tonics;

    public static Finder<Integer, Tonic> find = new Finder<>(
            Integer.class, Tonic.class
    );

}
List<Gin> gins = Gin.find.all();
for(Gin x : gins){
    System.out.println("idGin: " + x.getIdGin());
    System.out.println("Tonics: "+ x.getTonics());
    System.out.println("---------------------");
}
List gins=Gin.find.all();
用于(杜松子酒x:杜松子酒){
System.out.println(“idGin:+x.getIdGin());
System.out.println(“补品:+x.getTonics());
System.out.println(“--------------------------”;
}
编辑:

我知道,当我执行x.getTonics.get(0)时,它会与延迟加载一起工作。它会给我以下错误:


据我所知,查询是否错误,因为他不知道gin2tonic中的列是id\u-gin而不是idGin(如果我错了,请更正我)

两个实体中都有相同类型的列表变量,具有多对多关系。在Tonic类中将列表类型更改为gin。是否

@Entity
public class Gin extends Model {
    @Id
    @Column(name="idGin")
    private Integer idGin;
    private String aroma;
    ...// some other vars from the database not important

    @ManyToMany
    @JoinTable(name="gin2tonic")
    private List<Tonic> tonics;

        public static Finder<Integer, Gin> find = new Finder<>(
            Integer.class, Gin.class
    );
}


@Entity
public class Tonic extends Model {
    @Id
    @Column(name="idTonic")
    private Integer idTonic;

    private String aroma;

    // some other vars from the database not important


    @ManyToMany(mappedBy = "tonics")
    public List<Gin> gins;                    //changed to Gin type

    public static Finder<Integer, Tonic> find = new Finder<>(
            Integer.class, Tonic.class
    );

}
@实体
公共类模型{
@身份证
@列(name=“idGin”)
私有整数idGin;
私家串香;
…//数据库中的其他一些变量不重要
@许多
@可接合(name=“gin2tonic”)
私人列表补品;
公共静态查找器find=新查找器(
Integer.class,Gin.class
);
}
@实体
公共类模型{
@身份证
@列(name=“idTonic”)
私有整数idTonic;
私家串香;
//数据库中的其他一些变量并不重要
@许多(mappedBy=“tonics”)
公用列表Gin;//更改为Gin类型
公共静态查找器find=新查找器(
Integer.class,Tonic.class
);
}

谢谢您的帮助。但是现在当我想打印列表时,我的BeanList被推迟了?难道我不需要将gin2tonic id_-gin与idGin in-gin和同样的补品结合起来吗?@user1007522你能用细节编辑你的问题吗?我刚刚编辑了这个问题。我想我只需要添加一些重命名的内容,但找不到正确的注释。@user1007522使用
@Jointable
指定列名,感谢您进行了一些研究。我知道rawsql选项,但是如果我想使用rawsql,为什么要使用ORM:D呢