[英]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
变量的XParseLinks
( preke
: XParseLinks
对象是否具有其主键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.