1

私はJPAが初めてで、次のような2つのテーブル間の関係を作ろうとしています:

これはメイン クラス オブジェクト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オブジェクトを追加したい場合、 を取得しますが、それが ではないことを知っているため、変数に値があることがわかっています。fotosLinkId = 0LinkId0LinkId

クラスfotosで変数を設定しようとする方法は次のとおりです( :オブジェクトウィッチは主キーを持っています):XParseLinksprekeXParseLinksLinkId

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

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

preke.getFotos().add(foto);
4

1 に答える 1

0

あなたが何を期待しているのかわからなくても、あなたのコーディングをテストするとOKです。簡単なデータ初期化のために、いくつかをOverLoad Constructorクラスに入れました。しかし、あなたは を使っていますGenerationType.IDENTITY。それが私が の auto increate column を設定した理由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);
    }
}

テスト.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();
    }
}   
于 2012-10-25T09:40:52.223 に答える