繁体   English   中英

OneToMany和ManyToOne之间的JPA关联

[英]JPA releations between OneToMany And ManyToOne

我是JPA的新手,正尝试在两个表之间建立关系,如下所示:

这是主类对象XParserLinks

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "link_id")
    private Integer linkId;
    @OneToMany(mappedBy = "xParserLink", targetEntity = XLinksMedia.class, cascade = CascadeType.ALL)
    private List<XLinksMedia> fotos;
    ...

这是对象类XLinksMedia

public class XLinksMedia implements Serializable {
    private static final long serialVersionUID = 1L;
    @EmbeddedId
    protected XLinksMediaPK xLinksMediaPK;
    @ManyToOne @JoinColumn(name = "link_id")
    private XParserLinks xParserLink;

XLinksMediaPK

@Embeddable
public class XLinksMediaPK implements Serializable {
    @Basic(optional = false)
    @Column(name = "link_id", insertable = false, updatable = false)
    private int linkId;
    @Basic(optional = false)
    @Column(name = "image")
    private String image;

这些关系正确吗? 因为当我要添加新的XLinksMedia中的对象fotos列表中,我得到LinkId = 0 ,但我知道, LinkId是不是0 ,我知道LinkId变量有一个值。

这是我尝试在XParseLinks类中设置fotos变量的XParseLinksprekeXParseLinks对象是否具有其主键LinkId ):

XLinksMedia foto = new XLinksMedia();
foto.setXLinksMediaPK(new XLinksMediaPK());

foto.setxParserLink(preke);
foto.getXLinksMediaPK().setImage(e.attr("src"));

preke.getFotos().add(foto);

甚至我都不知道您的期望是什么,当我测试您的编码时,就可以了。 我只是将一些OverLoad Constructor函数放在类中,以方便数据初始化。 但是,您使用GenerationType.IDENTITY ,这就是为什么我为XParserLinks link_id设置了自动创建列的XParserLinks 以下编码的主要内容与您的相同。

您的观点Here's how I try to set fotos variable in XParseLinks class (preke: is XParseLinks object witch have his primary key LinkId): 检查Test.java

XParserLinks.java

@Entity
public class XParserLinks implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "link_id")
    private Integer linkId;
    @OneToMany(mappedBy = "xParserLink", targetEntity = XLinksMedia.class, cascade = CascadeType.ALL)
    private List<XLinksMedia> fotos;

    private String something;

    public XParserLinks() {
        fotos = new ArrayList<XLinksMedia>();
    }

    public XParserLinks(String something) {
        this.something = something;
        fotos = new ArrayList<XLinksMedia>();
    }
    //getter and setter
}       

XLinksMediaPK.java

@Embeddable
public class XLinksMediaPK implements Serializable {
    @Basic(optional = false)
    @Column(name = "link_id", insertable = false, updatable = false)
    private int linkId;
    @Basic(optional = false)
    @Column(name = "image")
    private String image;

    public XLinksMediaPK(){
    }

    public XLinksMediaPK(int linkId, String image) {
        this.linkId = linkId;
        this.image = image;
    }
    //getter and setter
}

XParserLinks.java

@Entity
public class XParserLinks implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "link_id")
    private Integer linkId;
    @OneToMany(mappedBy = "xParserLink", targetEntity = XLinksMedia.class, cascade = CascadeType.ALL)
    private List<XLinksMedia> fotos;

    private String something;

    public XParserLinks() {
        fotos = new ArrayList<XLinksMedia>();
    }

    public XParserLinks(String something) {
        this.something = something;
        fotos = new ArrayList<XLinksMedia>();
    }
    //getter and setter

    public void add(XLinksMedia media) {
        fotos.add(media);
    }
}

Test.java

public class Test {
    public static void main(String[] args) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("JPA");
        EntityManager em = emf.createEntityManager();
        em.getTransaction().begin();
        XParserLinks xParserLink = new XParserLinks("something");

        XLinksMediaPK pk1 = new XLinksMediaPK(0, "image_1");
        XLinksMediaPK pk2 = new XLinksMediaPK(0, "image_2");
        XLinksMediaPK pk3 = new XLinksMediaPK(0, "image_3");

        xParserLink.add(new XLinksMedia(pk1, xParserLink));
        xParserLink.add(new XLinksMedia(pk2, xParserLink));
        xParserLink.add(new XLinksMedia(pk3, xParserLink));

        em.persist(xParserLink);

        System.out.println("Success...");

        em.getTransaction().commit();
        em.close();
    }
}   

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM