कॉन्फ़िगजेपीए कई संबंध
- EcliplseLink 2.3.2
- जेपीए 2.0
- करने के लिए एक साथ संस्थाओं जारी रहती संस्थाओं डाटाबेस से इकाई वर्गों के साथ NetBeans से डाटाबेस स्कीमा से बनाए गए ऑटो रहे हैं ... विज़ार्ड।
- नियंत्रक कक्षाएं ऑटो इकाई वर्गों से जेपीए नियंत्रक वर्ग ... जादूगर
सवाल
के लघु संस्करण एक क्लासिक परिदृश्य में, करने के लिए एक साथ दो तालिकाओं के साथ NetBeans से बनाई गई हैं कई संबंध मैं मूल इकाई बना देता हूं, फिर बच्चा इकाई और मैं बच्चे को अभिभावक के संग्रह में संलग्न करता हूं। जब मैं पैरेंट इकाई (नियंत्रक विधि) बना देता हूं, तो मुझे उम्मीद है कि बाल इकाई को माता-पिता के साथ बनाया और संबद्ध किया जाएगा। ऐसा क्यों नहीं होता?
लांग संस्करण
जनक वर्ग
@Entity
@XmlRootElement
public class Device implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
private Integer id;
@Column(unique=true)
private String name;
@Temporal(TemporalType.TIMESTAMP)
private Date updated;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "deviceId")
private Collection<NetworkInterface> networkInterfaceCollection;
public Device() {
}
public Device(String name) {
this.name = name;
updated = new Date();
}
// setters and getters...
@XmlTransient
public Collection<NetworkInterface> getNetworkInterfaceCollection() {
return networkInterfaceCollection;
}
public void setNetworkInterfaceCollection(Collection<NetworkInterface> networkInterfaceCollection) {
this.networkInterfaceCollection = networkInterfaceCollection;
}
public void addNetworkInterface(NetworkInterface net) {
this.networkInterfaceCollection.add(net);
}
public void removeNetworkInterface(NetworkInterface net) {
this.networkInterfaceCollection.remove(net);
}
// other methods
}
बाल वर्ग
@Entity
@Table(name = "NETWORK_INTERFACE")
@XmlRootElement
public class NetworkInterface implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
private Integer id;
private String name;
@Temporal(TemporalType.TIMESTAMP)
private Date updated;
@JoinColumn(name = "DEVICE_ID", referencedColumnName = "ID")
@ManyToOne(optional = false)
private Device deviceId;
public NetworkInterface() {
}
public NetworkInterface(String name) {
this.name = name;
this.updated = new Date();
}
// setter and getter methods...
public Device getDeviceId() {
return deviceId;
}
public void setDeviceId(Device deviceId) {
this.deviceId = deviceId;
}
}
मुख्य वर्ग
public class Main {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("wifi-dbPU");
DeviceJpaController deviceController = new DeviceJpaController(emf);
NetworkInterfaceJpaController netController = new NetworkInterfaceJpaController(emf);
Device device = new Device("laptop");
NetworkInterface net = new NetworkInterface("eth0");
device.getNetworkInterfaceCollection().add(net);
deviceController.create(device);
}
}
यह सीएल गधा पंक्ति में एक NullPointerException फेंकता है: device.getNetworkInterfaceCollection().add(net);
प्रणाली जानता है एक नई इकाई device
है कि वहाँ और यह एक तत्व net
है यह संग्रह है में। मुझे उम्मीद है कि यह device
डीबी में लिखने के लिए, डिवाइस की आईडी प्राप्त करें, इसे net
से संलग्न करें और इसे डीबी में लिखें।
, मैंने पाया कि इन चरणों का मैं क्या करना है कर रहे हैं:
deviceController.create(device);
net.setDeviceId(device);
device.getNetworkInterfaceCollection().add(net);
netController.create(net);
क्यों मैं जब जनक वर्ग जानता है कि यह बच्चा है बच्चे पैदा करने के लिए है और यह मेरे लिए यह बनाना चाहिए ?
डिवाइस जेपी कंट्रोलर से निर्माण विधि (फ़ील्ड में लंबे नामों के लिए खेद है, वे ऑटो जेनरेट हैं)।
public EntityManager getEntityManager() {
return emf.createEntityManager();
}
public void create(Device device) {
if (device.getNetworkInterfaceCollection() == null) {
device.setNetworkInterfaceCollection(new ArrayList<NetworkInterface>());
}
EntityManager em = null;
try {
em = getEntityManager();
em.getTransaction().begin();
Collection<NetworkInterface> attachedNetworkInterfaceCollection = new ArrayList<NetworkInterface>();
for (NetworkInterface networkInterfaceCollectionNetworkInterfaceToAttach : device.getNetworkInterfaceCollection()) {
networkInterfaceCollectionNetworkInterfaceToAttach = em.getReference(networkInterfaceCollectionNetworkInterfaceToAttach.getClass(), networkInterfaceCollectionNetworkInterfaceToAttach.getId());
attachedNetworkInterfaceCollection.add(networkInterfaceCollectionNetworkInterfaceToAttach);
}
device.setNetworkInterfaceCollection(attachedNetworkInterfaceCollection);
em.persist(device);
for (NetworkInterface networkInterfaceCollectionNetworkInterface : device.getNetworkInterfaceCollection()) {
Device oldDeviceIdOfNetworkInterfaceCollectionNetworkInterface = networkInterfaceCollectionNetworkInterface.getDeviceId();
networkInterfaceCollectionNetworkInterface.setDeviceId(device);
networkInterfaceCollectionNetworkInterface = em.merge(networkInterfaceCollectionNetworkInterface);
if (oldDeviceIdOfNetworkInterfaceCollectionNetworkInterface != null) {
oldDeviceIdOfNetworkInterfaceCollectionNetworkInterface.getNetworkInterfaceCollection().remove(networkInterfaceCollectionNetworkInterface);
oldDeviceIdOfNetworkInterfaceCollectionNetworkInterface = em.merge(oldDeviceIdOfNetworkInterfaceCollectionNetworkInterface);
}
}
em.getTransaction().commit();
} finally {
if (em != null) {
em.close();
}
}
}
पुस्तक से जो मैंने पढ़ा है उसके अनुसार। 'कैस्केड = कैस्केड टाइप टाइपर्स' को सभी रिश्तों को जारी रखना चाहिए और आपको केवल एक इकाई को अपडेट करने की आवश्यकता है, जेपीए संबंधों के माध्यम से नेविगेट करेगा और संबंधित इकाइयों को अपडेट करेगा। लेकिन ... मैं इसे काम नहीं कर सका ... –